2015-08-13 19 views
0

我有一个存储在两个64位数组中的IP地址。我注意到最低有效位是在第一个字节 - 小端。减去两个IPv6地址给出错误的值

我正在减去两个只能有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

结果应该是。

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

在此先感谢!

+0

为什么不打印出你想要减去的东西?至少它会帮助你看到你正在处理的价值。 – PaulMcKenzie

回答

2

在六角7335之间的元素到7340的数目如下。

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

所以,当你从7340减去7335你会得到11以10为基数即0xbhex和那是什么你得到0xb,预计。

1

结果应该是5

不。这些IPv6地址中的数字全部以十六进制表示。

0x7340 - 0x7335是0XB

在基座10

29504 - 29493是11.