平台无关的htonl()函数和>>小端的操作员

时间:2016-01-13 13:30:28

标签: cross-platform bit-shift endianness htonl

我正在尝试理解以下平台无关的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也没有影响。

根据这些假设,我可以理解发生了什么,但我的假设是否正确?

感谢阅读...

0 个答案:

没有答案