C++套接字编程中的字节顺序问题

4
在C++中,我们通过网络套接字发送数据。我知道我们需要使用htons()和ntohs()函数来维护字节顺序,即大端和小端。支持我们有以下要发送的数据。
int roll;
int id;
char name[100];

这也可以包装成结构体。

我的困惑在于,对于rollid,我们可以使用htons()函数。但对于字符串name,我们应该如何处理?我们需要使用任何类似的函数吗?它会在像Mac、Intel和其他网络这样的每台机器上工作吗?

我想将所有三个字段一起发送到一个数据包中。

3个回答

7

对于int类型,应使用htonl而不是htons

由于数组的字节直接对应于网络上的字节,因此不需要重新排序名称。

字节顺序的问题只会出现在大于一个字节的单词中,因为不同的架构选择在哪个端点放置最不重要的字节。


@marcelo:可能是多字节字符?0x0001 变成了 0x0100? - Donotalo
Marcelo Cantos,看起来你是正确的。需要一些更多的信息。谢谢。 - Vijay
@Vijay:在除了一些奇怪的平台之外,char 的大小是一个字节: 八位。当你说“多字节”时,我想你指的是宽字符或 wchar_t,它们通常是16位,但有时是32位。无论哪种方式,可以相当确信 char 在任何基于 IP 的传输中都会编码为单个单位。如果您想发送 Unicode,则通常最好传输 UTF-8 编码而不是宽字符。 - Marcelo Cantos
@Marcelo Cantos - 你又是对的。但是让我感到困惑。如果我不进行转换就传输宽字符,它们能正常工作吗?UTF8本身就像字符数组,所以它应该可以工作。现在让我感到困惑了。 - Vijay
宽字符比一个字节大,因此如果您希望传输格式是字节顺序中立的,则需要进行字节顺序校正(htons)。正如您所指出的,UTF-8编码定义了一个字符级编码(一组字节),因此它没有这样的问题。 - Marcelo Cantos

1
对于字符数组来说,这种转换是不必要的,因为它们没有网络字节顺序,而是按顺序传输的。存在ntohshtons的原因是,某些数据类型由较低位和较高位组成,在不同的架构上解释方式不同。但字符串不是这种情况。

实际上,对于那些字节排序是问题。 - diverscuba23
1
你是指字符串吗?不,为什么应该是呢? - Constantinius
我指的是ntohs和htons及其相关函数。它们不会重新排列每个字节中的位,只会在主机字节顺序与网络字节顺序不同时交换字节顺序。 - diverscuba23
@diverscuba23:你不需要关心比特序,因为你可以使用的最小单位是字节。比特序只在硬件方面有影响。 - DarkDust

0
补充一下这里的有用评论——如果你的结构体变得更加复杂,你最好考虑使用类似Boost.SerializationGoogle Protocol Buffers的序列化库,它们在内部处理字节序。
编码字符串时,确保在字符串本身之前发送长度(可能是使用htons处理的short),不要每次只发送100个字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接