减去两个 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。
十六进制中7335
到7340
之间的元素个数如下。
7335
,7336,7337,7338,7339,733a,733b,733c,733d,733e,733f,
7340
因此,当您从 7340
中减去 7335
时,您将在基数 10 中得到 11
,即 hex
中的 0xb
,这就是您得到的 0xb
并且符合预期。
我有一个 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。
十六进制中7335
到7340
之间的元素个数如下。
7335
,7336,7337,7338,7339,733a,733b,733c,733d,733e,733f,
7340
因此,当您从 7340
中减去 7335
时,您将在基数 10 中得到 11
,即 hex
中的 0xb
,这就是您得到的 0xb
并且符合预期。