u_int32_t ip6_address[1][4] = { {0x00000001, 0x0, 0x0, 0x12345678} };
Run Code Online (Sandbox Code Playgroud)
用户可读的128位比六字节点式格式少得多.
保留虚线格式可能会导致低级别和应用程序软件的变化不那么剧烈.
IPv6地址是底层的128位无符号整数,因此它们的值范围为[0,3.40×10 ^ 38]
一个128位寄存器可以存储2 ^ 128(超过3.40×10 ^ 38)个不同的值。可以以128位存储的整数值的范围取决于所使用的整数表示形式。对于两种最常见的表示形式,范围是0到340,282,366,920,938,463,463,374,607,431,768,211,455(2 ^ 128?1),表示为(无符号)二进制数, https://en.wikipedia.org/wiki/128位
但是,无论使用哪种语言,双精度浮点变量都可以高达±1.79769313486231570e + 308,因此它绝对可以假定128位int可以且甚至可以包含所有值。
我确定有一个现成的功能/库/代码可以从IPv6 => double转换。任何人都可以发布代码来做到这一点,或链接吗?
谢谢
最好是PHP,但是您可以用其他语言发布代码,我将翻译成PHP。
PS我已经阅读了这个相关问题,可以双重使用来存储和安全地检索128位IPv6吗?但是IMO的答案是错误的,因为您不需要与IPv6地址(128位)具有相同位的变量。您只需要它能够假定IPv6可以具有的所有可能值。正如我上面所说,双精度数可以表示128位int甚至更多的可能值,尽管它仅仅是64位。
那怎么可能
这就是浮点寄存器的魔力。与整数计算相比,它们进行计算的CPU资源更多,但功能更强大。
编辑:为什么我需要这种转换:我有一个MySQL表,其IPv6地址定义为DECIMAL(39),这是一个39位的整数。如果是IPv6,我需要按访问者的地址查询该表。
嗨抱歉打扰你们.但我在杂志上读到了一些关于将代码移植到IPV6的内容,所以我试着改变这段代码(socket.AF_INET6,socket.SOCK_STREAM)
在python中它可以工作,但问题是服务器不显示客户端ip.
我希望它能像这样显示出来.得到了连接('127.0.0.1',59815).
但是对于它来说,它搞砸了所有的事情并且给了我这个(从(':: 1',59815,0,0)获得连接),所以如果我问这是客户端IP吗?那两个最后的零(0,0)究竟是什么意思?我该怎么做才能将我的代码移植到IPv6.谢谢我使用python(geany)
所以,如果我这样做(socket.socket(socket.AF_INET6,socket.SOCK_STREAM))我将我的代码放到IPV6,o还有其他一些我需要做的事感谢)