wchar_t 数据是不是需要字节序转换?
Posted
技术标签:
【中文标题】wchar_t 数据是不是需要字节序转换?【英文标题】:Is endian conversion required for wchar_t data?wchar_t 数据是否需要字节序转换? 【发布时间】:2010-09-30 02:36:51 【问题描述】:在 C/C++ 中,如果一个多字节宽字符 (wchar_t) 值从一个大端系统传输到一个小端系统(或反之亦然),它会在另一个系统中输出相同的值吗?边?还是需要交换字节?
【问题讨论】:
【参考方案1】:是的,您需要更换它们。 字节将按照它们放入的顺序从传输中检索。只是在另一端,这些字节的顺序具有不同的含义。因此,您需要将它们转换为正确的字节序(这是一个词吗?)。
久经考验的方法是在传输之前转换为网络字节顺序。然后在收到时转换回主机特定的字节顺序(从网络字节顺序)。
一组帮助进行字节序转换的函数:
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,它具有所有这些功能。
【讨论】:
可能比总是将所有内容转换为网络字节顺序更好的是在您的网络协议中包含一个字节顺序标志。这样,服务器可以按其本机字节顺序发送(减少服务器的负载),客户端可以确定是否需要转换消息。 @len:可能。但是服务器不是瓶颈吗?因此,谨慎的协议设计会将工作卸载到负载较少的客户端,这意味着客户端应该将数据转换为方便的服务器格式。这并不意味着网络字节顺序,但确实暗示字节顺序标志不合适。【参考方案2】:字节序转换是不够的,因此不需要。 Sizeof(wchar_t) 不同,因此编码也不同。因此,您需要就交换格式达成一致。合乎逻辑的选择是 UTF-8。但由于 UTF-8 是面向字节的,因此您不再有字节顺序问题。
【讨论】:
【参考方案3】:是的,您需要执行字节序转换。仔细定义您的序列化格式,即通过网络传输或存储到磁盘文件中的数据的字节顺序。然后,在发送数据时,从本机格式转换为有线格式(可能需要也可能不需要字节交换),在接收数据时,从有线格式转换为本机格式(同样可能需要也可能不需要字节交换)。您应该选择一种大多数客户端都会使用的有线格式,以最大限度地减少平均字节交换量。
【讨论】:
以上是关于wchar_t 数据是不是需要字节序转换?的主要内容,如果未能解决你的问题,请参考以下文章
python通过ntohl和htonl等函数实现主机字节序和网络字节序相互转换