我需要以可移植的方式将C struct
序列化到文件中,以便我可以在其他计算机上读取该文件,并且可以保证我将获得与放入的相同的内容。
文件格式无关紧要,只要它相当紧凑(如果不是为了便携性问题,写出结构的内存中表示将是理想的。)
有一种干净的方法可以轻松实现这一目标吗?
答案 0 :(得分:17)
您实际上是在设计二进制网络协议,因此您可能希望使用现有的库(如Google的协议缓冲区)。如果您仍想设计自己的,可以通过这样做来实现编写原始结构的合理可移植性:
__attribute__((packed))
,MSVC的#pragma pack
)。这是特定于编译器的。htons
,htonl
)。这是特定于体系结构的。uint32_t
等)。CHAR_BIT
为8的位置,这是最常见的,或以其他方式处理字符串到8位八位字节流的转换。在某些环境中CHAR_BIT
!= 8,但它们往往是专用硬件。通过这种方式,您可以合理地确定只要使用相同的结构定义,您将在另一端获得相同的结果。我不确定浮点数表示,但我通常会避免发送它们。
您可能希望解决的与可移植性无关的另一个问题是向后兼容性,方法是将长度作为第一个字段引入,和/或使用版本标记。
答案 1 :(得分:2)
您可以尝试使用协议缓冲区等库;滚动你自己可能不值得努力。
答案 2 :(得分:0)
为输出编写一个函数。 使用sprintf将每个字段的ascii表示打印到文件中, 每行一个字段。
写一个输入功能。 使用fgets从文件中加载每一行。 使用scanf转换为二进制文件,直接转换为结构中的字段。
如果您计划使用许多不同的结构, 考虑为每个文件添加一个标题,标识哪种结构 它代表着。