2011-11-26 37 views
9

私はちょうどファイル圧縮について学び始めています。私はいくつかのロードブロッキングを実行しました。私は圧縮されたバイナリ表現"010100111111011000"として "プログラム"のような文字列をエンコードするアプリケーションを持っています(これはまだ文字列として格納されています)。ビットの文字列表現をバイトに変換する

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

は今、私はFileOutputStream使用してファイルシステムにこれを記述する必要がある、私がいる問題は、私は、ファイルに書き込まれるようにbyte[]/byte sの文字列「010100111111011000」を変換することができますかシステム:FileOutputStream

私は以前はビット/バイトで作業したことがありません。だから私はここでは行き詰まっています。

+0

「圧縮バイナリ表現」について、長さが7文字( "program")の単語を表す18文字( "010100111111011000")の 'String'を持っているとします。あなたが頼んでいることを確信していますか?通常、これらのビットをXバイト数(この場合は3)に設定します。 –

+0

'ビットシフト演算子'を調べます: '>>'、 '>>>'、 '<<'。 – Kevin

+0

ブライアン、元のメッセージはバイナリに変換すると56ビットのサイズですが、エンコードされたメッセージはわずか18ビットです。 ケビンは、人々はそれを教え続けますが、私はまだそれらの演算子を使用して、これをバイト配列に変換することができるというリンクを描くことはできません。 –

答えて

6

ビットシフト演算子への導入:

まず、我々は、左シフト演算子、x << nを持っています。これはゼロで新しいビットを埋め、nビット左x内のすべてのビットをシフトします:

 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を持っています。これはゼロで新しいビットを埋め、右nビットでxのすべてのビットをシフト:

 1111 1111 
>>> 3: 0001 1111 

あなたも有用かもしれビット単位-またはオペレータ、x | y

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

あなたが当面の問題については、前のオペレータを必要とするだけ必要があります。これはオフ、それ以外の場合はxyのいずれかに上だった場合には、新しい番号のビットを設定し、xyの各位置のビットを比較し、しかし、完全を期すために、ここで最後の2つである:

ビット単位、およびオペレータ、x & y一方に出力のビットを設定した場合とビットが両方xy内にある場合にのみ:

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

ビットが1数または他のではなく、両方でオンになっている場合は、1つに出力ビットを設定x^yビット単位のXOR演算子:手元の状況にこれらを適用すること、今

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   ^

私は、もちろん、あなたの仕事にこれを適用するためにあなたにそれを残します。

+0

私のバイトを0000 0001として開始するには、これはバイトb = 1を書き込むのと同じです。 ?私は、バイナリ表現が何であるかを知るために、バイトの署名された性質のために、私は確信しています。 –

+0

あなたはそうすることができますが、一貫性のためにゼロバイトで始まり、 'for'または' while'ループを入力したいと思うでしょう。この例を少し編集して、これをもう少し明確にすることができるかどうかを確認します。 – Kevin

0

これらの0と1をバイナリ値としてファイルに書き込むとします。私は毎回8つの記号(String.substring()またはsmth)を取る文字列を繰り返し、Byte(String)コンストラクタでバイトを作成することができます。 今のところ私の頭に浮かぶ最も簡単な解決策です。

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

+0

これを試しました。バイト(String)コンストラクタは "0011"という文字列を取り、それを10進数の11として解釈します。 –

+0

Byte (String s、int radix)2進数を設定するコンストラクタです。 –

1

Stringを長さ8に切り、Byte#parseByteと呼んでください。 radix2に設定すると、Stringが2進数として解析されます。

+1

スレッド "main"の例外java.lang.NumberFormatException:値が範囲外です。値: "10000000"基数:2 先行ゼロがないかぎり、7の長さでしか動作しません。 –

+0

@John Lotacsなぜこれをやっているのかわかりませんが、['Integer#parseInt'](http://tinyurl.com/7uo6b5t)を使用して回避策として' byte'にキャストできます。 – Jeffrey

+0

@jeff 'byte'が署名されているので、' -111 1111'から '+111 1111'(-128 to +127)にする必要があります。ビットが「1000 0000」であるバイトは、実際には-128であり、パーザに「-1000 0000」として供給されなければならない。 – Kevin

関連する問題