1

アスキー文字を読み取り、それぞれの最初のビットを削除して (常に 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
4

2 に答える 2

1

入力が 8 ビット境界に収まらない状況を考慮していますか? Base 64エンコーディングが同じようなことをするときに持っている問題のようなものです....

于 2012-09-13T21:40:23.687 に答える
1

value問題は、解凍時にゼロにしないことです。

これは、ファイルの終わりに到達するまで効果がありません (余分なビットはローテーションされます)。

試す:

 if(++i == 8) {
     putchar(value);
     i = 1;
     value = 0; // Clean up
 }

テスト ケース (valueコマンド ライン引数があった場合、上記のプログラムをゼロのみに変更):

  echo "xxxxxxxRxx" | ./comp | ./decomp OK
  xxxxxxxRxx
  echo "xxxxxxxRxx" | ./comp | ./decomp
  xxxxxxxRzx
于 2012-09-13T21:46:00.830 に答える