【问题标题】:Can double be used to store and safely retrieve 128 bit IPv6?可以使用 double 存储和安全检索 128 位 IPv6 吗?
【发布时间】:2016-10-14 19:00:26
【问题描述】:

我们知道double 可以存储从±4.94065645841246544e-324±1.79769313486231570e+308 的号码。我们可以在double 中存储像 IPv6 这样的 128 位值并按原样检索吗?例如,要存储 IPv4,我们可以使用 32 位整数并将它们存储为 8 位分区。我们可以使用位掩码来检索它们。

没有标准容器可以存储任何语言 AFAIK 的 128 位。我知道double 可以安全地存储 64 位而不会出现任何精度错误,但是有什么 hack 吗?

【问题讨论】:

  • 你不能在小于128位的情况下存储128位的信息,double通常有64位,所以没有
  • 检查sizeof(double) 是什么。如果不是16,则不是。
  • 不,这行不通。 IPv6 地址是 128 位整数,其有效数字太多。浮点数没有足够的有效数字。

标签: c++ double ipv6


【解决方案1】:

技术上你可以,如果sizeof(double) * CHAR_BITS ≥ 128(在我的机器上是 64 位),但你为什么要这样做?不要重新发明轮子,而是使用sockaddr_in6,或者,如果必须的话,可以使用uint8_tstd::bitset 的数组。

相关回答:Efficient way to store IPv4/IPv6 addresses

【讨论】:

    【解决方案2】:

    我不愿意使用双精度,因为 its size is unspecified

    如果您需要 128 位整数,我建议使用 this question 中解释的非标准类型。

    【讨论】:

      猜你喜欢
      • 2013-09-23
      • 2011-08-09
      • 2016-09-18
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 2018-07-13
      • 2021-03-29
      相关资源
      最近更新 更多