我是C语言的新手,我面临的问题是我有一个解压的二进制文件(即它是某种格式的)。
我要做的就是把它打包,再解包一次,看看它是否与原始的解包版本相等。
值得一提的是:我被告知打包(即转换为已打包)和解包(即转换为未打包)功能工作得很好。我只想自己确认一下,并学习一点C语言...
我有两点认为我做错了
1:我读取文件的方式
2:我没有正确考虑压缩和解包的变量类型(即,对于压缩的,它是无符号字符*,对于非压缩的,它是短的*)
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;
}发布于 2011-10-24 21:59:33
这段代码是非常糟糕的。
当你应该比较内存时,你却在比较指针(originalUnpacked == unpacked)。为什么你要混合使用short *和unsigned char *指针呢?如果数据是二进制"blob",那么您可能只应该使用后者。
要比较内存,请使用标准的memcmp()函数。
发布于 2011-10-24 22:18:00
你需要更好地理解什么是指针。把指针想象成你放在字母上的地址,把数据或者内存想象成房子。如果我复制一份地址,现在有两个字母,但只有一个房子,这两个字母都指的是同一所房子,我可以用其中任何一个到达房子。现在,复制房子需要做的工作比仅仅复制信件上的地址要多得多。你需要一座新房子和一封新地址的新信。
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!https://stackoverflow.com/questions/7876749
复制相似问题