Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;socket编程中的字节顺序 在C++中,我们使用socket在网络上发送数据。我知道我们需要使用htons(),ntohs()函数来维护字节顺序大端数和小端数_C++_Sockets_Endianness - Fatal编程技术网

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编码定义了字符级编码(字节数组),因此它没有此类问题。