2

我目前正在尝试使用 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大。

4

1 回答 1

3

这是一个常见的问题。

首先,您需要打开输出文件writer以便以二进制模式写入 ( "wb")。

FILE *writer = fopen(argv[2], "wb");

其次,您不能使用fputs将任意数据写入文件,因为它需要一个字符串。改用fwrite:(假设writer是输出文件,dstFile解压后的数据和dstLength要写入的字节数)

fwrite(dstFile, 1, dstLength, writer);

如果您使用十六进制编辑器检查生成的文件,您会发现它与解压缩的数据相同。

测试更新

我写了一些测试代码来看看有什么问题,分享你的结果,这样我们就可以帮助你。

将这些函数添加到您的代码中:

void printDataToScreen(unsigned char *dataptr, int datalen)
{
    if (dataptr == NULL)
    {
        printf("[!] ERROR, NULL POINTER PROVIDED!\n");
        return;
    }
    printf("> Dumping %d bytes of data into the terminal...\n", datalen);
    for (int i = 0; i < datalen; i++)
    {
        if (i % 16 == 0)
            printf("\n   ");
        printf("%02X ", dataptr[i]);
    }
    printf("\n\n");
}

void writeDataToFile(char *fileName, unsigned char *dataptr, int datalen)
{
    FILE *file = fopen(fileName, "wb");
    if (dataptr == NULL)
    {
        printf("[!] ERROR, NULL POINTER PROVIDED!\n");
        return;
    } else if (file == NULL)
    {
        printf("[!] ERROR WHILE OPENING FILE '%s'!\n", fileName);
        return;
    }
    
    printf("> Writting %d bytes of data to '%s'...\n", datalen, fileName);
    int writtenBytes = fwrite(dataptr, 1, datalen, file);
    printf("   Done, %d bytes written!\n\n", writtenBytes);
    
    fclose(file);
}

void runTest(char *fileName, unsigned char *dataptr, int datalen)
{
    printf("Running tests... [0/2 done]\n");
    printDataToScreen(dataptr, datalen);
    printf("Running tests... [1/2 done]\n");
    writeDataToFile(fileName, dataptr, datalen);
    printf("Finished! [2/2 done]\n");
}

像这样称呼它:

runTest(argv[2], dstFile, dstLength);

在您的代码中添加对此位置的调用(注释此代码,也是您关闭的行writer):

FILE *writer = fopen(argv[2], "r+");
//fputs(fileInMem, writer);
//fputs(dstFile, writer);

请分享你的结果。

于 2021-03-17T02:57:14.933 回答