【发布时间】:2021-06-14 08:01:58
【问题描述】:
我目前正在尝试使用 CMP 解压缩器:https://web.archive.org/web/20070113004119/http://rewiki.regengedanken.de:80/wiki/.CMP
实际上它确实解压缩了 cmp,但它不会将其写入文件。 所以我自己尝试了。
int main(int argc, char** argv)
{
int length, dstLength;
unsigned char* fileInMem; //compressed data
unsigned char* dstFile; //decompressed data
if (argc < 2) {
fprintf(stderr, "give filename.cmp as parameter\n");
return 1;
}
printf("%s", argv[1]);
fileInMem = loadFile(argv[1], &length); //compressed data read
if (fileInMem == NULL) {
return 1;
}
dstFile = parseCmp(fileInMem, length, &dstLength); //decompress and assign data to dstFile
if (dstFile) {
/* Now we can save the file from dstFile, dstLength bytes */
printf("%d bytes depacked\n", dstLength);
for (int i = 0; i < 16; i++) {
dataArray[i] = fileInMem[i];
}
FILE *writer = fopen(argv[2], "r+");
//fputs(fileInMem, writer);
//fputs(dstFile, writer);
fclose(writer);
free(dstFile);
}
free(fileInMem);
return 0;
}
如您所见,解压缩的数据是指向无符号字符的指针(根据网站的比特流),我尝试了 stdio.h 中的 fputs(),但以十六进制查看时,生成的文件仅包含 4 个字节-编辑。
如果您需要更多信息,请发表评论。
提前谢谢你。
编辑:感谢您的帮助,这是我能够更改的内容,但是当我打开文件时,它仍然是空的:
FILE* writer = fopen(argv[2], "wb");
fwrite(dstFile, 192, 192, writer);
192,因为第一个解压后的Image长度为192 Bytes大。
【问题讨论】:
-
fputs用于字符串。它不适用于二进制数据,因为它会在数据中有 0 时立即停止(这在二进制数据中很常见)。使用fwrite。 -
在您的帮助下,我能够输出原始数据。解压后的数据根本没有写,不过我觉得和你的回答没有关系。至少我学到了一些新东西。谢谢凯勒姆。