我有一个char xyz [2]; 我在xyz [0]和xyz [1]中以网络字节顺序接收2个八位字节数。如何将其更改为主机顺序。 我如何使用ntohs转换xyz。请帮忙。
答案 0 :(得分:5)
您的意思是“如何将网络顺序中的数据流转换为主机顺序的数据流?”在这种情况下,您可以使用ntohs()
/ htons()
函数。但是要小心你如何调用它们,因为你可能不得不考虑对齐问题。通用的解决方案是手动交换(或每对)字节。
另一方面,如果要反序列化按网络顺序发送给您的数据,并且您希望使用在程序中的数据中序列化的值,那么概念“主令”是红鲱鱼。 所有您需要知道您收到的数据是以big-endian还是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
这是平台无关编程的典型标志:您的程序内部应完全独立于实现细节,并且必须在程序边界处精确指定固定实现(即(反)序列化)。
请注意,通常情况下,您不能只使用现有的字节缓冲区并将其解释为不同的值到位,因为标准不允许这样做。也就是说,您只能将数据视为已声明为int的int
。例如,以下内容是非法的:char * buf = get(); int a = *(int*)buf;
。合法版本以1}}
答案 1 :(得分:2)
试试这个:
uint16_t result = ntohs(*(uint16_t*)xyz);
答案 2 :(得分:0)
如果您知道主机订单和网络订单不同或什么都不做,请使用std::swap
?