如何在c中构造二进制文件头?

如何在c中构造二进制文件头?,c,data-structures,C,Data Structures,我已经为二进制文件创建了自己的文件头,其中包含: uint_8文件签名[4]这有助于识别我的文件 uint\U 8 CRLF\U CRLF[4]由“\r\n 0x32\n”组成,有助于识别不同的换行符 uint\U 8版本id版本号 uint_8到_数据的偏移量第一个数据块开始的位置(如果标题在下一版本中增长,则有用) uint_16收割台的尺寸收割台的尺寸 uint_32 CRC_校验和有助于测试数据是否正确 其他不相关的字段 这个问题主要涉及两个问题: 这些信息的最新顺序是什么 将它们

我已经为二进制文件创建了自己的文件头,其中包含:

  • uint_8文件签名[4]
  • 这有助于识别我的文件
  • uint\U 8 CRLF\U CRLF[4]
  • 由“\r\n 0x32\n”组成,有助于识别不同的换行符
  • uint\U 8版本id
  • 版本号
  • uint_8到_数据的偏移量
  • 第一个数据块开始的位置(如果标题在下一版本中增长,则有用)
  • uint_16收割台的尺寸
  • 收割台的尺寸
  • uint_32 CRC_校验和
  • 有助于测试数据是否正确
  • 其他不相关的字段
这个问题主要涉及两个问题:

  • 这些信息的最新顺序是什么
  • 将它们存储在字节数组或结构(WRT packing,即#pragma pack)中更好吗?
编辑:

数据存储在little endian中。

如果您想使用单个结构,打包可能会有所帮助,但还不够。您还需要关心长度超过1个单字节的任何值的endianess。@Gerhardh感谢您的评论,我对此表示感谢。我应该补充一点,我将所有数据存储在little-endian中。您能确保您的代码永远不会在big-endian机器上编译吗?在文件中定义字节顺序是个好主意,但您需要确保程序位于同一页上。这是正确的。在读取数据的过程中可能需要这样的转换,这可能会影响您的设计决策。如果您需要每隔一个字段翻转一次,那么使用具有缺点的压缩结构(wrt对齐等)就不那么诱人了。然后,您可以单独读取每个字段,并将其正确存储到非压缩结构中。但最终的决定是基于意见的。我的建议是避免使用struct访问二进制数据。它可能会工作,然后在不同的体系结构或编译器上中断。测试endianness很简单:只需查看包含1的整数的第一个字节。无论是什么系统,在小端系统上都是1,在大端系统上都是0。如果您想使用单个结构,打包可能会有所帮助,但还不够。您还需要关心长度超过1个单字节的任何值的endianess。@Gerhardh感谢您的评论,我对此表示感谢。我应该补充一点,我将所有数据存储在little-endian中。您能确保您的代码永远不会在big-endian机器上编译吗?在文件中定义字节顺序是个好主意,但您需要确保程序位于同一页上。这是正确的。在读取数据的过程中可能需要这样的转换,这可能会影响您的设计决策。如果您需要每隔一个字段翻转一次,那么使用具有缺点的压缩结构(wrt对齐等)就不那么诱人了。然后,您可以单独读取每个字段,并将其正确存储到非压缩结构中。但最终的决定是基于意见的。我的建议是避免使用struct访问二进制数据。它可能会工作,然后在不同的体系结构或编译器上中断。测试endianness很简单:只需查看包含1的整数的第一个字节。在小端系统上为1,在大端系统上为0,不管是什么系统。