2016-07-09 16 views
0

4ワード文字列からビットを送信するために、文字列からバイト配列を取得し、ビット文字列を計算しています。バイナリ文字列をJavaに変換する方法UFT-8を使用してエンコードされた文字列

StringBuilder binaryStr = new StringBuilder(); 

byte[] bytesFromStr = str.getBytes("UTF-8"); 
for (int i = 0, l = bytesFromStr.length; i < l; i++) { 
    binaryStr.append(Integer.toBinaryString(bytesFromStr[i])); 
} 

String result = binaryStr.toString(); 

逆の操作をしたいときに問題が表示されます。ビットストリングをUTF-8を使用してエンコードされたJava Stringに変換するときに表示されます。

私にそれを行う最善の方法を説明できる人がいますか?

ありがとうございます!

+0

私はこれが重複していると思う:http://stackoverflow.com/questions/5499924/convert-java-string-to-byte-array、少なくとも私はそれが役立つと思う。 – Gavin

+1

その操作を元に戻すことは不可能です。 100011010100110101100100が3バイト、4、または5の表現であるかどうかは分かりません...達成しようとしているのは何ですか?どうしてそんなことをするのか? –

+2

文字列 '' 1a ''がある場合、Unicode Tableの '49'、' 97'に配置された '1'と' a'文字から構築されます。バイナリ形式では、それらは '0110001'、' 1100001'と表現されるべきです。しかし、 'Integer.toBinaryString(49)'の結果は '0110001'ではなく' 110001'です(先行する '0'は無視されます)。 JB Nizet氏は、「111」が「1」「1」「1」「11」「1」か「1」「11」か「111」かを検出することは不可能であると指摘した。とにかくここであなたがしていることは[XY問題]のように見えます(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Pshemo

答えて

0

ありがとうございます@Andreas your code。あなたの関数を使ってテストし、これを使ってUTF-8に再び "デコード"してみましょう:

皆さんありがとうございます。

2

TL; DR toBinaryString()を使用しないでください。最後の解を参照してください。


Integer.toBinaryString()は、先行ゼロを返しません。

System.out.println(Integer.toBinaryString(1)); // prints: 1 
System.out.println(Integer.toBinaryString(10)); // prints: 1010 
System.out.println(Integer.toBinaryString(100)); // prints: 1100100 

目的に応じて、1バイトごとに常に8ビットを取得します。

また、負の値でエラーが発生しないようにする必要があります。それを達成する

System.out.println(Integer.toBinaryString((byte)129)); // prints: 11111111111111111111111110000001 

最も簡単な方法は次のようである:

Integer.toBinaryString((b & 0xFF) | 0x100).substring(1) 

まず、それはintにバイトbを強制し、例えば、次に下位8ビットのみを保持し、そして最終的には9番目のビットをセット129(小数)は1 1000 0001(バイナリ、スペースは分かりやすくするために追加されます)になります。その結果、9番目のビットが除外され、実質的に先行ゼロが確保されます。あなたのコードになる

た場合::

StringBuilder binaryStr = new StringBuilder(); 
for (byte b : str.getBytes("UTF-8")) 
    binaryStr.append(toBinary(b)); 
String result = binaryStr.toString(); 

例えば

これは、ヘルパーメソッドとしてそれを持っている方が良いでしょうstr = "Hello World"あれば、あなたが得る:

0100100001100101011011000110110001101111001000000101011101101111011100100110110001100100 

をもちろんただtoBinaryString()に頼ることなく、それを自分で行うことができます:

StringBuilder binaryStr = new StringBuilder(); 
for (byte b : str.getBytes("UTF-8")) 
    for (int i = 7; i >= 0; i--) 
     binaryStr.append((b >> i) & 1); 
String result = binaryStr.toString(); 

おそらくあまりにも速く実行すること。

+0

ありがとうございました@アンドレアス。私はあなたの実装で 'toBinaryString()'を避けて情報を回復しようとするいくつかのテストを行います。 – ocell

関連する問題