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

时间:2011-11-16 14:08:52

标签: c++

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

3 个答案:

答案 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 :(得分:2)

试试这个:

uint16_t  result = ntohs(*(uint16_t*)xyz);

答案 2 :(得分:0)

如果您知道主机订单和网络订单不同或什么都不做,请使用std::swap