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

标签 c++

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

最佳答案

您的意思是“如何将网络顺序的数据流转换为主机顺序的数据流?”在这种情况下,您可以使用 ntohs()/htons() 函数。但是,请注意如何调用它们,因为您可能必须考虑对齐问题。通用解决方案是手动交换(或每对)字节。

另一方面,如果您想要反序列化按网络顺序到达您的数据,并且您想要使用程序中数据中序列化的值,那么概念“主人令”是一条红鲱鱼。 所有您需要知道您收到的数据是大端还是小端顺序:

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;。合法版本以目标类型开始:int a; get_data((char*)&a);

关于c++ - 如何将 char[] 的前两个字节从网络字节序转换为主机字节序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8152964/

相关文章:

c++ - 将 vector 拆分为多个数组/vector C++

c++ - std::move 与编译器优化

c# - 向现有函数添加功能(C#、C++)

c++ - Windows 中的可变参数列表 va_list

c++ - boost 截止时间计时器的替代方案

c++ - 如何使用 Visual Studio 6 C++ 检测字符串中的换行符

c++ - Ogre3d restoreConfig 导致应用程序在 Ubuntu 上挂起

c++ - 转发声明并动态分配该声明类的指针数组?

c++ - 返回;只有没有返回值

c++ - 指向 CUDA 中对象指针数组的指针