圧縮された 41 kb ファイルでこれを使用すると (ただし、ランレングス エンコーディングを使用するため、常にファイルのサイズが 2 倍になるように見えます)、適切に解凍されます。ただ、16,173kbのファイルで使おうとして解凍したら開かず、ファイルサイズが16,171kbだったので解凍したのですが元の形に戻りませんでした.. ..何かがおかしくなった....私は困惑しましたか、私は自分が何を間違っているのか理解できないようです....
使用される方法はランレングス エンコーディングで、すべてのバイトをカウントとそれに続くバイトに置き換えます。
前:
46 6F 6F 20 62 61 72 21 21 21 20 20 20 20 20
後:
01 46 02 6F 01 20 01 62 01 61 01 72 03 21 05 20
これが私のコードです:
void compress_file(FILE *fp_in, FILE *fp_out)
{
int count, ch, ch2;
ch = getc(fp_in);
for (count = 0; ch2 != EOF; count = 0) {
// if next byte is the same increase count and test again
do {
count++; // set binary count
ch2 = getc(fp_in); // set next variable for comparison
} while (ch2 != EOF && ch2 == ch);
// write bytes into new file
putc(count, fp_out);
putc(ch, fp_out);
ch = ch2;
}
fclose(fp_in);
fclose(fp_out);
fprintf(stderr, "File Compressed\n");
}
void uncompress_file(FILE *fp_in, FILE *fp_out)
{
int count, ch, ch2;
for (count = 0; ch2 != EOF; count = 0) {
ch = getc(fp_in); // grab first byte
ch2 = getc(fp_in); // grab second byte
// write the bytes
do {
putc(ch2, fp_out);
count++;
} while (count < ch);
}
fclose(fp_in);
fclose(fp_out);
fprintf(stderr, "File Decompressed\n");
}