2

我正在尝试编写一个简单的 TGA 图像文件保护程序作为 C++ 的学习练习。我将我的代码基于一个示例 TGA 加载器,该加载器为标头声明一个结构,然后使用 fread() 一次性加载整个标头。

我的程序现在不工作,似乎有两个额外的字节被写入文件。我打印了我的结构的大小,它太大了两个字节(20 而不是正确的 18)。经过一点阅读,我认为问题与数据对齐和填充有关(我不太熟悉结构的存储方式)。

我的问题是什么是一个好的解决方案?我想我可以逐字节编写结构的组件,而不是使用 fwrite() 一次写入整个结构,这就是我现在要做的。我假设如果它在加载标题时起作用,那么在编写它时它也会起作用。我的假设不正确吗?

4

3 回答 3

4

编译器被允许并且经常这样做,将填充字节插入结构中,以便字段在适当的内存地址上对齐。

最简单的解决方案是指示编译器“打包”结构,这意味着不插入任何填充字节。然而,这会使对结构的数据访问变慢,并且这样做的方法是依赖于编译器的。如果您想要便携和高效,唯一的方法是单独编写字段。

于 2010-07-19T21:02:27.210 回答
1

即使加载它也不起作用。你有几个选择:

  1. 使用编译器特定的指令(#pragma packed 等)强制您的结构为 18 个字节。

  2. 通过使用偏移量和指针来获取/设置缓冲区字段,编写更便携的代码。

于 2010-07-19T21:02:45.473 回答
0

结构的元素通常排列在 4 字节边界上。

如果结构中有短裤或字符,则结构大于各个元素大小的总和。

于 2010-07-19T21:03:01.513 回答