9

ファイル圧縮について学び始めたばかりで、ちょっとした障害に遭遇しました。「プログラム」などの文字列を圧縮されたバイナリ表現としてエンコードするアプリケーションがあります"010100111111011000"(これはまだ文字列として保存されていることに注意してください)。

Encoding
g       111
r       10
a       110
p       010
o       011
m       00

これを を使用してファイル システムに書き込む必要がありますFileOutputStream。問題は、文字列 "010100111111011000" をbyte[]/ bytes に変換してファイル システムに書き込む方法FileOutputStreamです。

私は以前にビット/バイトを扱ったことがないので、ここで行き止まりになっています。

4

3 に答える 3

6

ビットシフト演算子の紹介:

まず、左シフト演算子x << n. xこれにより、すべてのビットが左にシフトされn、新しいビットがゼロで埋められます。

      1111 1111 
<< 3: 1111 1000

次に、符号付き右シフト演算子x >> n. これは、すべてのビットを n だけ右にシフトしx、符号ビットを新しいビットにコピーします。

      1111 1111 
>> 3: 1111 1111

      1000 0000
>> 3: 1111 0000

      0111 1111 
>> 3: 0000 1111

最後に、ゼロ埋め右シフト演算子 がありx >>> nます。xこれにより、すべてのビットがビット単位で右にシフトされn、新しいビットがゼロで埋められます。

       1111 1111 
>>> 3: 0001 1111

また、ビットごとの OR 演算子 が役立つ場合もありますx | yxこれは、との各位置のビットを比較しy、新しい数値のビットがxまたはyでオンの場合はオンに、そうでない場合はオフに設定します。

  1010 0101
| 1010 1010
  ---------
  1010 1111

目の前の問題には前の演算子のみが必要ですが、完全を期すために、最後の 2 つを次に示します。

ビットごとの and 演算子は、 and の両方でビットがオンの場合にのみ、出力のビットを 1 に設定x & yします。xy

  1010 0101
& 1010 1010
  ---------
  1010 0000

ビットごとの xor 演算子は、x ^ yどちらか一方の数値でビットがオンで、両方ではない場合、出力ビットを 1 に設定します。

  1010 0101
^ 1010 1010
  ---------
  0000 1111

ここで、これらを当面の状況に適用します。

ビットを追加および操作するには、ビット シフト演算子を使用する必要があります。文字列表現に従って右側のビットの設定を開始し、それらをシフトします。バイトの終わりに到達するまで続行し、次のバイトに移動します。「1100 1010」のバイト表現を作成したいとします。

Our byte    Target
---------   --------
0000 0000
            1100 1010
0000 0001   ^
            1100 1010
0000 0011    ^
            1100 1010
0000 0110     ^
            1100 1010
0000 1100      ^
            1100 1010
0001 1001        ^
            1100 1010
0011 0010         ^
            1100 1010
0110 0101          ^
            1100 1010
1100 1010           ^

もちろん、これをあなたの仕事に適用することはあなたに任せます。

于 2011-11-26T02:18:47.067 に答える
1

Stringの長さに切り刻み、 Byte#parseByte8を呼び出します。を に設定すると、が 2 進数として解析されます。radix2String

于 2011-11-26T01:40:29.673 に答える
0

これらの 0 と 1 をバイナリ値としてファイルに書き込みたいと思います。つまり、毎回 8 つの符号 (String.substring() または smth) を使用して文字列を反復処理し、Byte(String) コンストラクターでバイトを作成できます。今のところ私の頭に浮かぶ最も簡単な解決策です。

私が問題について正しくない場合は、それについてもっと教えてください。

于 2011-11-26T01:03:26.663 に答える