我的代码无法运行,我该如何修复它以便它可以在特殊的 RLE 中解析和编辑数据字节?

问题描述 投票:0回答:0
#include <stdlib.h>

// Function to locate variable-length fields in the compressed data
void findVariableFields(unsigned char* compressedData, int fileSize);

// Function to decompress the compressed data
int decompressData(unsigned char* compressedData, unsigned char* decompressedData, int fileSize);

int main() {
    // Open input file
    FILE* file = fopen("example.imp", "rb");
    if (file == NULL) {
        printf("Failed to open file\n");
        return 1;
    }

    // Get file size
    fseek(file, 0, SEEK_END);
    int fileSize = ftell(file);
    fseek(file, 0, SEEK_SET);

    // Allocate memory for compressed and decompressed data
    unsigned char* compressedData = malloc(fileSize);
    unsigned char* decompressedData = malloc(fileSize * 8);

    // Read compressed data
    fread(compressedData, fileSize, 1, file);
    fclose(file);

    // Find variable-length fields in the compressed data
    findVariableFields(compressedData, fileSize);

    // Decompress the compressed data
    int decompressedSize = decompressData(compressedData, decompressedData, fileSize);

    // Output decompressed data to a binary file
    FILE *outFile = fopen("output.bin", "wb");
    fwrite(decompressedData, decompressedSize, 1, outFile);
    fclose(outFile);

    // Free allocated memory
    free(compressedData);
    free(decompressedData);

    return 0;
}
void findVariableFields(unsigned char* compressedData, int fileSize) {
    int i = 0;
    while (i < fileSize) {
        unsigned char c = compressedData[i++];
        if (c >= 0x80) {
            if (c == 0x80) {
                // End of line
                i += (8 - (i % 8)) % 8; // Pad to byte boundary
            } else {
                // Variable-length field
                int fieldSize = c - 256;
                unsigned char fieldType = compressedData[i++];
                printf("Found variable-length field of type 0x%02X and size %d bytes at offset 0x%04X\n", fieldType, fieldSize, i);
                i += fieldSize - 1;
            }
        } else if (c > 0) {
            // Compressed run
            i++;
        } else {
            // Uncompressed run
            int runSize = compressedData[i++];
            i += runSize;
        }
    }
}
int decompressData(unsigned char* compressedData, unsigned char* decompressedData, int fileSize) {
    int i = 0;
    int j = 0;

    while (i < fileSize) {
        unsigned char c = compressedData[i++];
        if (c < 128) {
            // Uncompressed run
            for (int k = 0; k <= c; k++) {
                decompressedData[j++] = compressedData[i++];
            }
        } else if (c > 128 && c < 256) {
            // Compressed run
            unsigned char pixel = compressedData[i++];
            int count = c - 128;
            for (int k = 0; k < count; k++) {
                decompressedData[j++] = pixel;
            }
        } else if (c == 0x80) {
            // End of line
            j += (8 - (j % 8)) % 8; // Pad to byte boundary
        } else {
            // Variable-length field
            int fieldSize = c - 256;
            i++; // Skip field type byte
            i += fieldSize - 1; // Skip variable field data
        }
    }

    return j;
}


我有一个特殊的压缩文件类型。它从许多文件中压缩出来,但它丢失了数据。使用这段代码,我应该得到一个二进制文件,其中包含已用零值编码的缺失变量字段的重要地址。大多数变量字段都在标头中,但许多变量字段的编码取决于有多少文件被编译并存在于 RLE 中。

c hex rle
© www.soinside.com 2019 - 2024. All rights reserved.