C++;socket编程中的字节顺序 在C++中,我们使用socket在网络上发送数据。我知道我们需要使用htons(),ntohs()函数来维护字节顺序大端数和小端数
支持我们将发送以下数据C++;socket编程中的字节顺序 在C++中,我们使用socket在网络上发送数据。我知道我们需要使用htons(),ntohs()函数来维护字节顺序大端数和小端数,c++,sockets,endianness,C++,Sockets,Endianness,支持我们将发送以下数据 int roll; int id; char name[100]; 这也可以包装到struct中 我的困惑是,对于roll和id,我们可以使用htons()函数。但是对于字符串名,我们应该做什么以及如何做呢?我们需要使用任何这样的功能吗?它能在mac、intel和其他网络设备上运行吗 我想在一个包中发送所有三个字段 您将使用htonl表示int,而不是htons 名称不需要重新排序,因为数组的字节直接对应于网络上的字节 字节顺序的问题只会在大于一个字节的字中出现,因为不
int roll;
int id;
char name[100];
这也可以包装到struct中
我的困惑是,对于roll和id,我们可以使用htons()函数。但是对于字符串名,我们应该做什么以及如何做呢?我们需要使用任何这样的功能吗?它能在mac、intel和其他网络设备上运行吗
我想在一个包中发送所有三个字段 您将使用
htonl
表示int
,而不是htons
名称不需要重新排序,因为数组的字节直接对应于网络上的字节
字节顺序的问题只会在大于一个字节的字中出现,因为不同的体系结构选择不同的端来放置最低有效字节。对于字符数组,这种转换是不必要的,因为它们没有网络字节顺序,而是顺序传输的。之所以存在
ntohs
和htons
是因为某些数据类型由较小和较大的位组成,这些位在不同的体系结构上有不同的解释。字符串的情况并非如此。要在此处添加有用的注释,如果您的结构变得更复杂,您最好考虑像or这样的序列化库,它可以在封面下为您处理endianness
编码字符串时,请确保在字符串本身之前发送一个长度(可能是使用
htons
处理的short
),不要每次只发送100个字符。实际上,对于那些字符串,字节顺序是个问题。你是指字符串吗?不,为什么会这样?我指的是NTOH和HTON及其相关功能。不需要对每个字节内的位进行任何重新排列,只要在主机字节顺序与网络字节顺序不同时交换字节顺序即可。@diverscuba23:您不需要考虑位的性别,因为您可以使用的最小单位是字节。位性只在硬件中起作用。@marcelo:可能是多字节字符?0x0001变为0x0100?Marcelo Cantos看起来你是对的。需要更多的信息。thanks@Vijay:除了最奇怪的平台外,在所有平台上,char
与字节大小相同:8位。当你说“多字节”时,我假设你指的是宽字符,或wchar\u t
,通常是16位,但有时是32位。无论哪种方式,都可以很安全地假设char
将在任何基于IP的传输上作为单个单元进行编码。如果您想发送Unicode,通常最好发送UTF-8编码,而不是宽字符。@Marcelo Cantos-您又是对的。但是让我困惑。宽字符如果我不转换xmit它们会工作吗?utf8本身就像字符数组,所以它可以工作。现在让我感到困惑的是,宽字符大于一个字节,因此如果您希望传输格式不受字节顺序的影响,则需要对其进行字节顺序更正(htons
)。正如您所指出的,UTF-8编码定义了字符级编码(字节数组),因此它没有此类问题。