字节交换结构

时间:2010-10-07 00:42:03

标签: c serialization struct

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

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

X

5 个答案:

答案 0 :(得分:7)

原则上,您可以浏览结构并分别在每个htonlhtons字段上调用uint32_tuint16_t,将结果分配回来或复制到副本结构。但是,我不建议采用这种方法。它非常脆弱,受结构对齐问题等影响。

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

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

答案 1 :(得分:0)

如果要通过网络发送数据,您需要查看使用网络到主机和主机到网络的字节排序功能。

http://beej.us/guide/bgnet/output/html/multipage/htonsman.html

答案 2 :(得分:0)

答案 3 :(得分:0)

回应:感谢您的回复。我想CORRECT的答案是,对于结构,数组和这样的内存blob,你必须实现自己的序列化函数......这很好......我会调查一下。在我尝试这样的事情之前,我想要一个好的感觉......

X

答案 4 :(得分:0)

还要研究为解决这个问题而实施的框架,它允许您对任意复杂的数据结构进行编组/解组。如果您要在大于几种类型的规模上执行此操作,请使用框架。

  1. rpcgen / XDR:不要让所有关于RPC /客户端/服务器的讨论吓跑你。您可以使用rpcgen为您的数据生成XDR编组/解编程例程,您可以按照自己喜欢的方式进行传输。
  2. Flick IDL Compiler Kit
  3. CORBA:大多数CORBA框架都有IDL编译器,例如: ACE TAO
  4. ASN.1:如果你喜欢一些痛苦。虽然很有异国情调。