减去两个IPv6地址会产生错误的值

时间:2015-08-13 10:31:21

标签: c++ c network-programming ipv6

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

我正在减去两个只能相差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)。

提前致谢!

2 个答案:

答案 0 :(得分:2)

在十六进制中,73357340之间的元素数量如下。

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

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

答案 1 :(得分:1)

  

结果应为5。

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

0x7340 - 0x7335是0xb

在基地10

29504 - 29493是11。