我试图理解以下独立于平台的 htonl() 代码:
uint32_t htonl(uint32_t val)
{
uint8_t v[4];
uint32_t *result = (uint32_t *)v;
int i;
for (i=0; i<4; i++) {
v[i] = (uint8_t)(val >> ((3-i) * 8));
}
return *result;
}
我做了一个例子,希望有人能证实我的假设是正确的。
假设我们在地址 100 有 0x 4A 3B 2C 1D。在 BE 机器上它看起来像
地址:字节值
100:4A
101:3B
102:2C
103:一维
在 LE 机器上,它看起来像
地址:字节值
100:一维
101:2C
102:3B
103:4A
现在我们调用 htonl() 并存储地址 500 的结果
在 BE 上:
地址:字节值
500:4A
501:3B
502:2C
503:一维
在 LE 上:
地址:字节值
500:4A
501:3B
502:2C
503:一维
因此,为 BE 调用 htonl() 没有任何净效果,而 LE 则颠倒了字节顺序。
现在是 htonl() 代码。让我们从 for 循环中进行第一次迭代 (i=0)。
我的假设是:
对于 BE 系统:
(uint8_t)(val >> 24) 会将值为 4A 的字节从地址 100 移动到 >address 103
V[0] 是地址 500
对于 LE 系统:
(uint8_t)(val >> 24) 会将值为 4A 的字节从地址 103 移动到地址 100(因此从 BE 的角度来看,这将是左移)。
V[0] 是地址 500——这是有效的,因为 v[8] 是 uint8_t。如果 v 是 uint64_t 那么 v[0] 将是地址 503 并且 htonl() 对 LE 也没有影响。
有了这些假设,我可以理解正在发生的事情,但我的假设是否正确?
感谢阅读……</p>