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();
おそらくあまりにも速く実行すること。
私はこれが重複していると思う:http://stackoverflow.com/questions/5499924/convert-java-string-to-byte-array、少なくとも私はそれが役立つと思う。 – Gavin
その操作を元に戻すことは不可能です。 100011010100110101100100が3バイト、4、または5の表現であるかどうかは分かりません...達成しようとしているのは何ですか?どうしてそんなことをするのか? –
文字列 '' 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