什么是将结构写入C中的文件的可移植方式?

Jus*_*tin 13 c serialization

我需要以可struct移植的方式将C序列化为文件,以便我可以在其他机器上读取该文件,并且可以保证我将获得与我放入的相同的内容.

文件格式无关紧要,只要它相当紧凑(如果不是为了便携性问题,写出结构的内存中表示将是理想的.)

有一种干净的方法可以轻松实现这一目标吗?

Ale*_*x B 17

您实际上是在设计二进制网络协议,因此您可能希望使用现有的库(如Google的协议缓冲区).如果你仍然想要自己设计,你可以通过这样做来实现编写原始结构的合理可移植性:

  1. 打包您的结构(GCC __attribute__((packed)),MSVC #pragma pack).这是特定于编译器的.
  2. 确保整数字节顺序正确(htons,htonl).这是特定于体系结构的.
  3. 不要对字符串使用指针(使用字符缓冲区).
  4. 使用C99精确整数大小(uint32_t等).
  5. 确保代码仅编译CHAR_BIT8(最常见)或以其他方式处理字符串到8位八位字节流的转换.在某些环境中CHAR_BIT!= 8,但它们往往是专用硬件.

有了这个,您可以合理地确定只要您使用相同的结构定义,您将在另一端获得相同的结果.我不确定浮点数表示,但我通常避免发送它们.

与您可能想要解决的可移植性无关的另一个问题是通过引入长度作为第一个字段和/或使用版本标记来向后兼容.

  • @DuncanJones Wayback机器来救援![首先](http://web.archive.org/web/20110918055802/http://serghei.net/docs/programming/autobook-1.1/writing20portable20c.html),[Second](http://web.archive .ORG /网络/ 20110725164734/HTTP://www.chris-lott.org/resources/cstyle/portableC.html) (2认同)