将IPv6地址转换为64位double

时间:2019-03-12 19:42:02

标签: php c++ floating-point ipv6

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-bit

不管使用哪种语言,双精度浮点变量都可以高达±1.79769313486231570e + 308,因此它绝对可以假定128位int可以使用的所有值,甚至更多。

我确定有一个现成的功能/库/代码可以从IPv6转换为=> double。 任何人都可以发布代码来做到这一点,或链接吗?

谢谢

最好使用PHP,但是您可以用其他语言发布代码,我会翻译成PHP。

P.S。 我已经阅读了Can double be used to store and safely retrieve 128 bit IPv6?的相关问题,但是IMO的答案是错误的,因为您不需要与IPv6地址(128位)具有相同位的变量。 您只需要它能够假定IPv6可以具有的所有可能值。 正如我上面所说,双精度数可以表示128位int甚至更多的可能值,尽管它仅仅是64位。

那怎么可能?

这是浮点寄存器的魔力。 与整数计算相比,它们在计算方面要占用更多CPU,但功能更强大。

编辑:为什么我需要这种转换: 我有一个MySQL表,其IPv6地址定义为DECIMAL(39),这是一个39位的整数。如果是IPv6,我需要按访问者的地址查询该表。

0 个答案:

没有答案