字节交换结构

Xof*_*ofo 0 c serialization struct

好吧,我不想问这个问题......但是这里有.我在x86机器上用C编写了一些代码.我想通过网络发送一个结构,并且我想将结构转换为网络字节顺序...我理解所有关于打包和gcc打包编译的戏剧......我想知道的是我如何转换网络字节顺序的结构(或数组或任何此类任意内存blob).

是否有我可以使用的标准(Unix/Linux/Posix)函数调用,或者我必须自己编写.

X

R..*_*R.. 7

原则上,您可以分别通过结构和调用htonlhtons在每个uint32_tuint16_t字段上,将结果返回或分配给结构的副本.但是,我不建议采用这种方法.它非常脆弱,受结构对齐问题等影响.

除非传输和接收数据对性能至关重要,否则我只需为您的结构实现正确的序列化和反序列化方法.您可以以二进制格式一次写出一个字节的数值,选择是否要先写入最不重要或最重要的部分.但实际上,我建议选择一种现代的基于文本的序列化格式,如json或(嗯,我讨厌这样说)xml.序列化和反序列化文本的成本非常小,并且在调试简易性和可扩展性方面的优势是显着的.

最后,如果你想使用文本但是发现json或xml太令人厌恶,太沉重或太过学习曲线,你总是可以使用printfscanf格式化以固定顺序读取和写入结构作为文本.以十六进制而不是十进制写入所有数值(包括浮点数)可能会略微提高性能并确保浮点值的往返精度.如果你没有C99,浮点数的另一个选项可能是将它们分解为尾数/指数形式,并使用frexp和重新组合它们ldexp.

  • `#pragma pack`不是远程可移植的,并且对于无法进行未对齐访问的体系结构的编译器将不得不付出很大的努力来实现它.如果您正在编写要以二进制形式通过网络发送的结构,则应该使用大小为1,2或4字节的固定大小类型,并对它们进行排序,即使它们每个都需要等于其大小的对齐,没有填充. (3认同)