endianness是否会反转数组?

时间:2014-02-27 16:56:39

标签: c network-programming endianness

我从网络接收缓冲区,这是一个大端,我在一个小端系统上。在我的系统上使用之前,是否必须反转缓冲区?我不确定字节顺序是否仅反转单个类型的字节顺序,或者它是否也适用于整个缓冲区。

例如,假设我从网络接收到unsigned long s的缓冲区,而且我在一个小端系统上。代码是这样的:

for(int i=0;i<size;i++)
    system_buffer[i]=ntohl(network_buffer[i]);

在我使用system_buffer之前,我是否还必须将其反转(所以最后一个元素成为第一个元素,反之亦然)?

reverse_buffer(system_buffer);

此外,如果我收到unsigned char的数组,我是否需要补偿字节序,或者我可以按原样使用缓冲区吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

Endianess仅适用于单个变量,
即。仅限于每个数组元素值,而不是数组中元素的顺序。

1字节变量的字节顺序不能反转,
所以不需要对它们做任何事情。

答案 1 :(得分:1)

字节顺序会影响大小大于一个字节的整数的字节顺序(即它不会影响字节或int8_t)。

您需要以整数的字节顺序读取协议描述。

答案 2 :(得分:1)

字节序仅影响数据字中的字节顺序(不是位)。由于char的大小始终为一个字节,因此您无需对它们进行任何调整。标准库函数ntohl将无符号整数(l)的字节顺序从网络字节顺序(n)更改为主机字节顺序(h)。因此,在使用之前不需要反转缓冲区。您只需要更改缓冲区中每个元素的字节顺序。

for(int i = 0; i < size; i++) {
    // network byte order to system byte order

    system_buffer[i] = ntohl(network_buffer[i]);
}

// process system_buffer