所以我正在写一个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个额外的字节,但是当我单独编写结构的每个元素时,它不会添加它们。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
您的行号不正确
fwrite(&p,sizeof(PACKET),sizeof(PACKET),f);
结构大小为2,因此您正在编写其中2个,这是您的两个额外字节来自的位置。它应该是
fwrite(&p,sizeof(PACKET),1,f);
额外字节仅出现在文件末尾的原因是因为您使用fseek()
来定位文件指针,该指针正确递增2. NB。当您按顺序写入文件时,无论如何都不需要使用fseek()
。此外,您使用offsetCounter += 0x02;
进行了硬编码,而不是使用offsetCounter += sizeof(PACKET)
。