如何在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,不管是什么系统。