c - 字节交换结构

标签 c serialization struct

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

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

x

最佳答案

原则上,您可以遍历结构并在每个 uint32_tuint16_t 上调用 htonlhtons字段,分别将结果分配回或分配给结构的副本。但是,我不推荐这种方法。它非常脆弱,容易出现结构对齐问题等。

除非传输和接收数据对性能极为关键,否则我会简单地为您的结构实现适当的序列化和反序列化方法。您可以以二进制格式一次写入一个字节的数值,选择是先写入最低有效部分还是最高有效部分。但实际上,我建议选择一种现代的基于文本的序列化格式,例如 json 或(呃,我讨厌这样说)xml。序列化和反序列化文本的成本非常小,在调试易用性和可扩展性方面的优势显着。

最后,如果你想使用文本,但觉得 json 或 xml 太令人反感、太重或学习曲线太长,你总是可以只使用 printfscanf 格式化以按固定顺序将结构读写为文本。以十六进制而不是十进制写入所有数值(包括 float )可能会稍微提高性能并确保浮点值的往返精度。如果您没有 C99, float 的另一种选择可能是将它们分解为尾数/指数形式,然后使用 frexpldexp 重新组合它们。

关于c - 字节交换结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877928/

相关文章:

c - 使用 Glade(和 C)的 GTK+ 中消息对话框的信号处理程序

c - C 参数值中的单链表

c++ - OpenGL 'deprecated' 功能可能不受支持吗?

.net - DataContractJsonSerializer 何时包含类型信息?

apache-spark - Spark 任务不可序列化 Hadoop-MongoDB-Connector 安然

go - 添加 3 种方法或通用方法

c - 将大型结构转储到文本文件的一些智能方法

嵌套 For 循环后的计数值 - 谷歌撰写

serialization - `fmt` 包的函数是否支持数组的格式化程序?

c - 为结构成员生成随机字符串