wchar_t数据是否需要字节序转换?

时间:2009-01-07 18:47:44

标签: c++ c endianness data-transfer wchar-t

在C / C ++中,如果一个多字节宽字符(wchar_t)值从一个大端系统传输到一个小端系统(反之亦然),它会在另一个系统上传出相同的值吗?侧?或者需要交换字节吗?

3 个答案:

答案 0 :(得分:9)

是的,您需要更换它们 将按照它们放入的相同顺序从传输中检索字节。就在另一端,这些字节的顺序具有不同的含义。所以你需要将它们转换为正确的字节序(是一个单词?)。

经过验证的方法是在传输之前转换为网络字节顺序。然后在接收时转换回主机特定的字节顺序(来自网络字节顺序)。

一组帮助endian转换的函数:

ntohs   Convert a 16-bit quantity from network byte order to host byte order
ntohl   Convert a 32-bit quantity from network byte order to host byte order
htons   Convert a 16-bit quantity from host byte order to network byte order
htonl   Convert a 32-bit quantity from host byte order to network byte order

添加另一个注意事项 不同的系统对wchar_t使用不同的大小,所以不要假设sizeof(wchar_t)== 2.

此外,每个主机可以为wchar_t使用不同的表示格式 为了帮助解决这个问题,大多数系统将文本转换为已知的传输格式(UTF-8或UTF-16是很好的选择)。将文本转换回另一端的主机特定格式。

你可以看看IBM的icu,它拥有所有这些功能。

答案 1 :(得分:5)

Endian转换不充分,因此不需要。 Sizeof(wchar_t)不同,因此编码也不同。因此,您需要就交换格式达成一致。合乎逻辑的选择是UTF-8。但由于UTF-8是面向字节的,因此不再存在字节序问题。

答案 2 :(得分:0)

是的,您需要执行endian转换。仔细定义序列化格式,即通过网络传输或存储到磁盘文件中的数据的字节顺序。然后,在发送数据时,从本机格式转换为有线格式(可能需要也可能不需要字节交换),并且在接收数据时,从有线格式转换为本机格式(再次可能需要也可能不需要字节交换)。您应该选择大多数客户端将使用的有线格式,以最小化平均字节交换量。