【发布时间】:2019-03-12 19:42:01
【问题描述】:
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。
附: 我已经阅读了这个相关问题Can double be used to store and safely retrieve 128 bit IPv6?,但 IMO 的答案是错误的,因为您 不需要 与 IPv6 地址(128 位)具有相同位的变量。 您只需要它能够假设 IPv6 可以具有的所有可能值。 正如我上面所说,尽管它只是 64 位,但 double 可以表示 128 位 int 的所有可能值,甚至更多。
这怎么可能?
这就是浮点寄存器的神奇之处。 与整数计算相比,它们在计算时占用更多 CPU,但功能更强大。
编辑:为什么我需要这种转换: 我有一个 MySQL 表,其中 IPv6 地址定义为 DECIMAL(39),它是一个 39 位整数。如果是 IPv6,我需要按访问者的地址查询该表。
【问题讨论】:
-
double无法存储范围内的每个唯一值。它仅限于一定数量的有效数字。如果它适合 64 位,则它最多可以表示2^64不同的可能值(否则至少 2 个值将共享相同的位表示,此时它们不再不同),远远小于2^128. -
有什么原因不能使用
inet_pton,它不会返回双精度值,但这很重要吗? -
听起来像是一个 xy 问题。为什么您认为需要将 ip 转换为双精度值?
-
"double 可以表示 128 位 int 的所有可能值,甚至更多,尽管它只是 64 位。"没门。忘记关于双精度和整数的所有细节,那么在 128 位中有 2^128 个不同的值,在 64 位中只有 2^64。你的问题是基于一个错误的前提,而且还不清楚为什么你首先想要一个双倍
-
我认为你应该先阅读信息科学的基础,然后再从事编程工作。请。
标签: php c++ floating-point ipv6