为什么在socket编程中消息不需要是网络字节顺序?

时间:2014-02-06 11:29:36

标签: linux sockets

据我所知,服务器地址和端口号应以网络字节顺序存储(没有任何内容,但以Big Endian格式存储)。但是,我无法理解以下内容。如果两台不同的机器具有不同的字节顺序,那么消息将如何不受影响?请点亮一下。要在套接字上发送号码,我们是否总是需要进行网络字节排序?

1 个答案:

答案 0 :(得分:1)

此问题不仅出现在套接字编程中,还出现在不同体系结构计算机之间的任何连接中。我们将套接字地址转换为BE,使它们与套接字协议相对应,并被网络设备正确识别。消息endianess只是您的责任。这就是为什么开发人员通知一些数据必须首先是最高字节(MSB)或先低字节字节(LSB)。

另外,我必须冷静一下,这条规则只影响多字节变量(float,int等),字符和字符数组不受影响。字节顺序仅设置值的字节顺序,而不是位的顺序,因此LE和BE体系结构中的一个字节值相同。 要避免任何字节序问题,请设置协议的通用字节顺序(MSB或LSB)并将所有多字节变量转换为字节数组。

void int_to_arr(uint32_t a, uint8_t *b){
    b[0] = (a >> 24) & 0xff; //take only MSB
    b[1] = (a >> 16) & 0xff; //take third byte
    b[2] = (a >> 8) & 0xff; //take second byte
    b[3] = a & 0xff; //take LSB
}
void arr_to_int(uint8_t *a, uint32_t *b){
    *b = a[3]; //move LSB
    *b |= a[2] << 8; //add second byte
    *b |= a[1] << 16; //add thirs byte
    *b |= a[0] << 24; //add MSB
}

这就是如何在字节数组中对无符号整数进行MSB表示。

相关问题