我从网络接收缓冲区,这是一个大端,我在一个小端系统上。在我的系统上使用之前,是否必须反转缓冲区?我不确定字节顺序是否仅反转单个类型的字节顺序,或者它是否也适用于整个缓冲区。
例如,假设我从网络接收到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
的数组,我是否需要补偿字节序,或者我可以按原样使用缓冲区吗?
谢谢!
答案 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