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

Subtracting two IPv6 Addresses Gives Wrong Value

我有一个 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)。

提前致谢!

The result should be 5.

没有。这些 IPv6 地址中的数字都是十六进制的。

0x7340 - 0x7335 是 0xb

以 10 为基数

29504 - 29493 是 11。

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

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

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