c++ - 减去两个 IPv6 地址得到错误的值

标签 c++ c network-programming ipv6

<分区>

我有一个 IP 地址存储在两个 64 位数组中。我注意到最低有效位在第一个字节小端。

我正在减去两个只能相差 64 位的 IPv6 地址。所以基本上,我只需要减去 addr_end[1]-addr_begin[0]得到结果。

但是结果不正确。

这是我正在尝试的代码:

struct m128bit {
    union {
        uint8_t  val8[16];
        uint16_t val16[8];
        uint32_t val32[4];
        uint64_t val64[2]; 
    } u;
};
//Overflows 64 bit, too big range (little endian representation)
if (local_begin.u.val64[0] != local_end.u.val64[0]) {
    cout<<"Range is too big!"<<endl;
    return 0;
}
else {
    return (local_end.u.val64[1])-(local_begin.u.val64[1]);
}

结果是 0xb 。 我正在传递以下 IP: 2001:0db8:85a3:0000:0000:8a2e:0370:7335 - 2001:0db8:85a3:0000:0000:8a2e:0370:7340

结果应该是5

我错过了什么?我尝试申请 htobe64()同时减去地址,但这也不起作用(我得到 0xb ,而不是 0xb00000000000000 )。

提前致谢!

最佳答案

73357340之间的十六进制元素个数如下。

7335,7336,7337,7338,7339,733a,733b,733c,733d,733e,733f,7340

因此,当您从 7340 中减去 7335 时,您将得到基数为 10 的 11,即 0xb >hex 这就是您得到的 0xb 并且是预期的。

关于c++ - 减去两个 IPv6 地址得到错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31985708/

相关文章:

c++ - 陷入 while 循环 C++

c - 12 :4: error: variable-sized object may not be initialized

java - UDP 中的服务器-客户端

networking - 为什么 TCP/IP header 的大小必须是 32 位的倍数?

c++ - 对于多个进程访问的 sqlite 数据库,哪种 NFS 实现是安全的

c++ - 在 GLM (OpenGL) 中将矩阵和 vector 相乘

c - 如何在 CUDA 中将包含数组的结构传递给内核?

c - 为什么具有 0 超时或 10 秒超时的 SO_LINGER 选项不立即或 10 秒后删除套接字?

c++ - 任何好的 C++/C NNTP 库?

Connect-N 棋盘游戏,当宽度为 >> 高度时崩溃