アスキー文字を読み取り、それぞれの最初のビットを削除して (常に 0 になるため)、新しいファイルに貼り付けるカスタム圧縮アルゴリズムを C で作成しています。入力を元のサイズの 7/8 にします。圧縮は次のとおりです。
#include <stdio.h>
int main()
{
int i = 1;
int c;
unsigned short value = 0;
while((c = getchar()) != EOF)
{
value = (c << i) | value;
if(i != 1) putchar(value >> 8);
value = value << 8;
i++;
if(i == 9) i = 1;
}
if(i != 1) putchar(value >> 8);
}
そして、ここに解凍があります:
#include <stdio.h>
int main() {
int i = 1;
int c;
unsigned char value = 0;
while((c = getchar()) != EOF) {
value = (c >> i) | value;
putchar(value);
value = (c << (8-i)) | 0;
value = value >> 1;
if(++i == 8) {
putchar(value);
i = 1;
}
}
}
「ororororor」のようなものを (引用符なしで) 圧縮してから解凍すると、出力は「orororor.r」になります。16 進数で 7F です。ただし、「ororororrr」と入力すると、正しい「ororororrr」が出力されます。特定の入力でのみ失敗しますが、失敗するパターンが見つかりません。
これは関数に含まれていないことを残念に思います。私がこれまで使用してきた方法は、UNIX で次のコマンドを使用することです。
echo -n your input here > data
gcc compress.c
./a.out < data > inp
gcc decompress.c
./a.out < inp > out
hexdump -C out