草庐IT

go - 倒序转换整数以倒序生成IP

coder 2024-07-11 原文

我想以相反的顺序生成 IP。

生成IP地址的函数如下:

val := 1<<(32-prefixLen) // let take prefixLen as 24
IP4(val) = IP4(256) = 0.0.1.0

我想要反向顺序的 IP,即 0.1.0.0,所以将 val 转换为反向字节并将其发送到 IP4()函数。

我尝试过的功能导致整数溢出:

temp1:=byte(val*0xff<<24)    
temp2:=byte(val*0xff00<<16)   
temp3:=byte(val*0xff0000<<8)
temp4:=byte(val*0xff000000)  
valReverse := uint32(temp4)|uint32(temp3)|uint32(temp2)|uint32(temp1)
IP4(valReverse)=0.1.0.0 //expected

最佳答案

反转字节

首先,您必须使用 uint32 类型而不是 byte,因为 byte 值只有 8 位(8 位以上的位不不存在)。

接下来,您必须使用按位与,即 & 而不是乘法 *

第三,移位值不正确。请参阅此工作示例:

prefixLen := uint32(24)

var val uint32
val = 1 << (32 - prefixLen)
fmt.Printf("%08x\n", val)

temp1 := uint32(val & 0xff << 24)
temp2 := uint32(val & 0xff00 << 8)
temp3 := uint32(val & 0xff0000 >> 8)
temp4 := uint32(val & 0xff000000 >> 24)
valReverse := uint32(temp4) | uint32(temp3) | uint32(temp2) | uint32(temp1)

fmt.Printf("%08x\n", valReverse)

输出(在 Go Playground 上尝试):

00000100
00010000

但我个人只会使用 net.IP使用字节 slice 对 IP 地址建模的类型,使用它您可以使用 slice 反转算法简单地反转字节。

这是它的样子:

ip := net.IPv4(0, 0, 1, 0).To4()
fmt.Println(ip)

// Reverse:
for i, j := 0, len(ip)-1; i < j; i, j = i+1, j-1 {
    ip[i], ip[j] = ip[j], ip[i]
}
fmt.Println(ip)

输出(在 Go Playground 上尝试):

0.0.1.0
0.1.0.0

注意:如果您将 IP 作为 uint32 的值,您仍然可以使用 net.IP 类型,创建 net.IP 像这样的值:

ip := net.IPv4(byte(val>>24), byte(val>>16), byte(val>>8), byte(val)).To4()

反转位

如果你想反转位,你必须一点一点地做。一种可能的解决方案是:

prefixLen := uint32(24)

var val uint32
val = 1 << (32 - prefixLen)
fmt.Printf("%08x\n", val)

var valReverse uint32
for i := 0; i < 32; i, val = i+1, val>>1 {
    valReverse = valReverse<<1 | val&0x01
}
fmt.Printf("%08x\n", valReverse)

输出(在 Go Playground 上尝试):

00000100
00800000

另一种可能更复杂的反转位的方法:

var valReverse uint32
for mask1, mask2 := uint32(0x01), uint32(0x80000000); mask2 != 0; mask1, mask2 = mask1<<1, mask2>>1 {
    if val&mask1 != 0 {
        valReverse |= mask2
    }
}

输出是一样的,在 Go Playground 上试试这个变体.

关于go - 倒序转换整数以倒序生成IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40522005/

有关go - 倒序转换整数以倒序生成IP的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  6. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  7. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  8. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  9. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  10. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

随机推荐