Hel*_*rld -3 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位
但是,无论使用哪种语言,双精度浮点变量都可以高达±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,我需要按访问者的地址查询该表。
Xir*_*ema 11
但是,无论使用哪种语言,双精度浮点变量都可以高达±1.79769313486231570e + 308,因此它绝对可以假定128位int可以且甚至可以包含所有值。
这个假设是错误的。双精度浮点变量不能假定128位int可以具有所有值。
这是因为计算机科学中的浮点类型精度有限。一旦获得大于2 ^ 52的数字,就无法再表示该范围内的单个整数。您被限制为2 ^ 52、2 ^ 52 + 2、2 ^ 52 + 4、2 ^ 52 + 6,...直到达到2 ^ 53,这时您将失去更多的精度,仅代表值2 ^ 53、2 ^ 53 + 4、2 ^ 53 + 8、2 ^ 53 + 12,...
因此,例如,如果您的IPv6地址为2 ^ 52 + 1,则a double将无法表示该地址。
因此,不可能,无法在由double64位浮点值定义的空间中表示IPv6地址的整个范围。
请参见浮点数学是否已损坏?有关浮点数学在计算机中的工作方式的详细说明。
问题的一部分似乎是类型之间有些混淆。一个DECIMAL在计算机科学的类型不是同一种类型的的double类型。decimal类型通常是BigNum实现的一种。他们可能可以存储一个完整的IPv6地址,但不会仅用64位来存储。它会使用数据库实现所需的任何位数(可能多于128位,因为decimal通常是设计用于处理定点数学)。
如果您需要在数据库中保存的IPv6地址,您可能能够逃脱它与一个decimal(39)类型,但是,你应该使用这些,而不是一个是安全的:
VARCHAR(或其他类似字符串的字段),每个字符节省8位VARCHAR字段,用于将IP地址保存为十六进制编码的字符串(如它们通常的表示方式)。VARCHAR字段,用于将IP地址保存为BASE64编码的字符串| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |