我是C的新手,我面临的问题是我有一个解压缩的二进制文件(即以某种格式)...
我想要做的是打包并重新打开它,看看它是否与原始的解压缩版本相同。
值得一提的是:我被告知打包(即转换为打包)和解包(即转换为解压缩)功能运行良好..只是想为自己确认并学习一点C ... < / p>
我认为我犯了两个错误
1:我正在阅读文件的方式
2:我没有正确考虑打包和解包的变量类型(即打包时它是unsigned char *,而unpacked则是short *)
int main(void) {
FILE *fp;
unsigned char* packed ;
short* unpacked;
size_t result;
int fileSize;
fp = fopen(FILENAME, "rb");
fseek (fp , 0 , SEEK_END);
fileSize = ftell (fp);
rewind (fp);
unpacked = (short*) malloc (sizeof(char)*fileSize);
result = fread(unpacked,1,fileSize,fp);
short *originalUnpacked = unpacked;
convert_to_packed(&unpacked, &packed);
convert_to_unpacked(&unpacked, &packed);
if (originalUnpacked == unpacked)
{
puts ("Thats it !!");
}
fclose(fp );
return EXIT_SUCCESS;
}
答案 0 :(得分:3)
此代码非常破碎。
您应该在比较内存时比较指针(originalUnpacked == unpacked
)。为什么要混合short *
和unsigned char *
指针?如果数据是二进制“blob”,则应该只使用后者。
要比较内存,请使用标准memcmp()
功能。
答案 1 :(得分:0)
您需要更好地了解指针是什么。可以将指针视为您放在字母上的地址,将数据或内存视为房子。如果我复制一份地址,现在有两个字母,但只有一个房子,两个字母都指的是同一个房子,我可以用它们来到房子里。现在,复制房子需要更多的工作,而不仅仅是复制信件上的地址。你需要一所新房子和一封带有新地址的新信件。
unpacked = (short*) malloc (sizeof(char)*fileSize);
^^ ^^
the letter building the house
short *originalUnpacked = unpacked;
^^ ^^
new letter old letter = copying the letter (address) not the house!
if (originalUnpacked == unpacked)
^^ ^^
new letter old letter - neither changed so are equal (same address)
您将此地址提供给转换函数convert_to_packed
和convert_to_unpacked
,然后覆盖原始数据,因为您忘记构建新房子以保留原始数据。
要修复代码,您需要构建一个新房子并使用它来存储打包和解包的结果。然后你需要比较两个房子的内容,而不是那些解决它们的字母。
short newUnpacked = (short*) malloc (sizeof(char)*fileSize);
convert_to_packed(&unpacked, &packed);
convert_to_unpacked(&unpacked, &newUnpacked); // put unpacked data into new house!
if (memcmp (unpacked, newUnpacked, filesize) == 0) // comparing contents of houses!