【发布时间】:2014-11-23 20:02:09
【问题描述】:
所以我正在编写一个 RLE 压缩器,基本上,您运行一个文件(相同字节的连续字符串)并将其转换为一个数据包。例如,如果文件包含: 0xFF 0xFF 0xFF 0xFF 0xBB 0xBB 0xBB 你会把它转换成数据包,包含一个长度和数据:它会变成 0x04FF 0x03BB。你明白了。
我使用一个结构来定义数据包。 (byte 是无符号 8 位类型的 typedefd 类型)
typedef struct /* Each packet has a length and a data byte */
{
byte length; /* how many elements of data there is */
byte data; /* whatever byte is being repeated */
} PACKET;
我有我的 writeData 函数:
void writeData(FILE* f, int offset, PACKET p)
{
fseek(f,offset,SEEK_SET); /* move to the offset to write */
fwrite(&p,sizeof(PACKET),sizeof(PACKET),f); /* write the packet to the given offset */
}
这是调用函数的代码
offsetCounter = 0x0; /* reset offset counter */
for(i = 0; i < nPackets; i++) /* nPackets is the total amount of packets created */
{
writeData(fDest,offsetCounter,packet[i]);
printf("Wrote %d:0x%X to 0x%X\n",packet[i].length,packet[i].data,offsetCounter);
offsetCounter += 0x02; /* skip 2 bytes to write the next packet */
}
当我运行程序时,一切正常,数据包被正确写入文件,除了某些原因,在文件的最后,自动添加了 2 个 0x00 字节。所以,出于某种原因,它只是增加了 2 个额外的空字节。
然而,当我这样写 writeData 函数时:
void writeData(FILE* f, int offset, PACKET p)
{
fseek(f,offset,SEEK_SET);
fwrite(&p.length,sizeof(byte),sizeof(byte),f);
fwrite(&p.data,sizeof(byte),sizeof(byte),f);
}
,将结构的每个字节单独写入,它不再在文件末尾添加2个额外的空字节。..
我真的很困惑,为什么当我编写结构时,它工作正常,但在最后增加了 2 个额外的字节,但是当我单独编写结构的每个元素时,它并没有添加它们。
有人可以帮我解决这个问题吗?
【问题讨论】:
-
你在什么硬件上?更具体地说,硬件和编译器的对齐/填充要求是什么?
-
在任何地方插入
printf("%d\n", (int)sizeof(PACKET));,结果可能会让您大吃一惊。 -
@Jongware,打印
size_t的正确方法是%zu(注意:windows 卡在 C89,所以这不会在那里工作)。