2

我试图理解以下独立于平台的 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>

4

0 回答 0