我有一个存储在两个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
)。
提前致谢!
答案 0 :(得分:2)
在十六进制中,7335
到7340
之间的元素数量如下。
<强> 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。