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



我知道服务器地址和端口号应存储在网络字节顺序中(这没什么,但以大型endian格式存储)。但是,我无法理解以下内容。如果这两台不同的机器具有不同的末日性,那么该消息将不会受到影响?请给它一些灯。对于在套接字上发送号码,我们是否总是需要进行NetworkByte订购?

此问题不仅出现在套接字编程中,而且出现在不同体系结构机之间的任何连接中。我们将套接字地址转换为使它们各自到套接字协议,并被网络设备正确识别。消息端只是您的责任。这就是为什么开发人员通知某些数据必须首先是最重要的字节(MSB)或不太重要的字节(LSB)。

另外,我必须让您平静,因为该规则仅影响多重变量(float,int等),字符和字符阵列不会受到影响。Endianness仅设置值的字节顺序,而不是位阶,因此在LE和BE Architectures上,一个字节值相同。为了避免任何endianness问题,请设置协议(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
}

这就是您可以在字节阵列中对未签名的int表示MSB的方式。

最新更新