好吧,我不想问这个问题......但是这里有。我在x86机器上用C编写了一些代码。我想通过网络发送一个结构,并且我想将结构转换为网络字节顺序...我理解所有关于打包和gcc打包编译的戏剧......我想知道的是我如何转换网络字节顺序的结构(或数组或任何此类任意内存blob)。
是否有我可以使用的标准(Unix / Linux / Posix)函数调用,或者我必须自己编写。
X
答案 0 :(得分:7)
原则上,您可以浏览结构并分别在每个htonl
或htons
字段上调用uint32_t
或uint16_t
,将结果分配回来或复制到副本结构。但是,我不建议采用这种方法。它非常脆弱,受结构对齐问题等影响。
除非传输和接收数据对性能至关重要,否则我只需为您的结构实现正确的序列化和反序列化方法。您可以以二进制格式一次写出一个字节的数值,选择是否要先写入最不重要或最重要的部分。但实际上,我建议选择一种现代的基于文本的序列化格式,如json或(嗯,我讨厌这样说)xml。序列化和反序列化文本的成本非常小,并且在调试简易性和可扩展性方面的优势非常明显。
最后,如果您想使用文本但发现json或xml过于令人反感,过于沉重或过多的学习曲线,您可以随时使用printf
和scanf
格式来阅读和以固定顺序将结构写为文本。以十六进制而不是十进制写入所有数值(包括浮点数)可能会略微提高性能并确保浮点值的往返精度。如果您没有C99,浮点数的另一个选项可能是将它们分解为尾数/指数形式,并使用frexp
和ldexp
重新组合它们。
答案 1 :(得分:0)
如果要通过网络发送数据,您需要查看使用网络到主机和主机到网络的字节排序功能。
http://beej.us/guide/bgnet/output/html/multipage/htonsman.html
答案 2 :(得分:0)
答案 3 :(得分:0)
回应:感谢您的回复。我想CORRECT的答案是,对于结构,数组和这样的内存blob,你必须实现自己的序列化函数......这很好......我会调查一下。在我尝试这样的事情之前,我想要一个好的感觉......
X
答案 4 :(得分:0)