我正在尝试理解以下平台无关的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:1D
在LE机器上它看起来像
地址:字节值
100:1D
101:2C
102:3B
103:4A
现在我们调用htonl()并存储地址500
的结果在BE:
地址:字节值
500:4A
501:3B
502:2C
503:1D
在LE:
地址:字节值
500:4A
501:3B
502:2C
503:1D
因此,为BE调用htonl()没有净效应,并且LE反转了字节顺序。
现在为htonl()代码。让我们从for -loop进行第一次迭代(i = 0)。
我的假设是:
对于BE系统:
(uint8_t)(val&gt;&gt; 24)会将值为4A的字节从地址100移至&gt;地址103
V [0]是地址500
对于LE系统:
(uint8_t)(val&gt;&gt; 24)会将值为4A的字节从地址103移位到地址100(因此从BE角度来看,这将是左移)。
V [0]是地址500 - 这是有效的,因为v [8]是uint8_t。如果v是uint64_t那么v [0]将是地址503并且htonl()对LE也没有影响。
根据这些假设,我可以理解发生了什么,但我的假设是否正确?
感谢阅读...