2014-02-27 27 views
2

我正在从网络接收一个缓冲区,这是一个大端,我在一个小端系统。在我的系统上使用它之前,是否必须将缓冲区反转?我不确定字节序是否仅颠倒单个类型的字节排序,或者是否也适用于整个缓冲区。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秒的阵列,还需要一种用于端序补偿在所有,或我可以使用缓冲液作为-是?

谢谢!

+4

阅读此:http://commandcenter.blogspot.co.uk/2012/04/byte-order-fallacy.html – this

回答

3

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

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

1

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

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

1

字节顺序只影响数据字中的字节顺序(不是位)。由于char的大小始终为1个字节,因此不必对它们进行任何调整。标准库函数ntohl将网络字节顺序(n)的无符号整数(l)的字节顺序更改为主机字节顺序(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