如何将char []的前两个字节从网络字节顺序转换为主机字节顺序?

Ers*_*had 1 c++

我有一个char xyz [2]; 我在xyz [0]和xyz [1]中以网络字节顺序接收2个八位字节数.如何将其更改为主机顺序.我如何使用ntohs转换xyz.请帮忙.

Ker*_* SB 5

您的意思是"如何将网络顺序中的数据流转换为主机顺序的数据流?" 在这种情况下,您可以使用ntohs()/ htons()functions.但是要小心你如何调用它们,因为你可能不得不考虑对齐问题.通用解决方案是手动交换(或每个)字节对.

另一方面,如果要反序列化按网络顺序发送给您的数据,并且您希望使用程序中数据中序列化的值,那么"主机订单"的概念就是红色鲱鱼.所有你需要知道您收到的数据是否是大端或little-endian顺序:

unsigned short int le_value = xyz[0] + (xyz[1] << 8);   // little-endian
unsigned short int be_value = xyz[1] + (xyz[0] << 8);   //    big-endian
Run Code Online (Sandbox Code Playgroud)

这是平台无关编程的典型标志:您的程序内部应完全独立于实现细节,并且必须在程序边界(即(de)序列化)精确指定固定实现.

请注意,在一般情况下,你不能只是将现有的字节的缓冲区,并把它解释为不同的值来代替,因为这不是标准允许.也就是说,您只能将数据视为int已声明为int的数据.例如,以下是非法的:char * buf = get(); int a = *(int*)buf;.合法版本以目标类型开头:int a; get_data((char*)&a);