バイトをバイナリ文字列表現に変換する方法


92

例えば、バイトのビットがBある10000010どのように私は、文字列にビットを割り当てることができ、str文字通り、です、str = "10000010"

編集する

バイナリファイルからバイトを読み取り、バイト配列に格納しますB。使用しますSystem.out.println(Integer.toBinaryString(B[i]))。問題は

(a)ビットが(左端)1で始まる場合、出力はB[i]負のint値に変換されるため、正しくありません。

(B)ビットで始まる場合0、出力は無視し0、例えば、想定B[0]00000001を有し、出力される1代わりに00000001


1
よくわかりません; これはトリックですか?
Dave Newton

1
a byteをbase 2の文字列に変換する方法を尋ねていますか?
SLaks

私はちょうどのために働く(2進数の文字列に値を変換)これを行うための別のスレッドへの答えを追加しましたBooleanByteShortCharInt、とLongstackoverflow.com/a/54950845/501113
chaotic3quilibrium

回答:


169

使用Integer#toBinaryString()

byte b1 = (byte) 129;
String s1 = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
System.out.println(s1); // 10000001

byte b2 = (byte) 2;
String s2 = String.format("%8s", Integer.toBinaryString(b2 & 0xFF)).replace(' ', '0');
System.out.println(s2); // 00000010

デモ


私はこの方法を試しました。私の場合、バイナリファイルからバイトを読み取り、バイト配列に格納していますB。使用しますSystem.out.println(Integer.toBinaryString(B[i]))。この方法を使用すると、問題は(a)ビットが(左端)1で始まる場合、B[i]負のint値に変換されるため、出力が正しくありません。(b)ビットが0で始まる場合、出力ignore 0は、たとえばB[0]hasを仮定します00000001。出力は次の1代わりに00000001
Sean

1
@Sean:a)byteJavaのa は8ビットの符号付き2の補数の整数であるために発生します。最小値は-128(2 ^ 8)で、最大値は127です。b)これString.format("%8s", Integer.toBinaryString(b)).replace(' ', '0')を使用して、結果の文字列にゼロを埋め込むことで簡単に修正できます。
ジョアン・シルバ

1
@ジョアン:あなたのアドバイスをありがとう。(a)に対処する方法、元のビット形式(1で始まる)を文字列に格納する方法について何か考えがありますか?
Sean

1
@ショーン:はい、&それだけで0xFF
ジョアン・シルバ

11
@Sean:& 0xFF基本的にa signed byteをに変換しますunsigned integer。たとえば、-129あなたが言ったように、はで表され11111111111111111111111110000001ます。この場合、基本的には最初(最下位)の8ビットが必要なので、AND(&)と0xFF00000000000000000000000011111111)を使用して、必要のない左側の1を効果的に削除し、だけを除外し10000001ます。
ジョアン・シルバ

32

私はこれを使いました。他の回答と同様のアイデアですが、正確なアプローチはどこにも見当たりませんでした:)

System.out.println(Integer.toBinaryString((b & 0xFF) + 0x100).substring(1));

0xFF255、または11111111(符号なしバイトの最大値)。 0x100256、または100000000

&整数にバイトをupcasts。その時点で、それは0- 25500000000から11111111、先頭の24ビットを除外したもの)まで何でもかまいません。先行ゼロがあること+ 0x100.substring(1)確認します。

JoãoSilvaの回答と比較して時間を計ったところ、これは10倍以上速くなっています。http://ideone.com/22DDK1 Pshemoの回答は適切に埋め込まれないため、含めていません。


ねえ!これについて質問を受けました。PDFのBase64表現文字列があります。バイナリに変換する必要があります。基本的に、Base64-> byte-> binaryこのコードは機能しますか?
2016

+ 0x100は正確には何をしますか?結果の整数に256を追加していますが、なぜですか?
Conner Dassen

1
@ConnerDassenバイナリ文字列に0が埋め込まれるようにします。例えば、場合がbある1なしで、+ 0x100あなただけ取得する"1"あなたの文字列として。追加する1ことで取得100000001し、最初の文字を無視して部分文字列を取得すると、適切な結果が得られます"00000001"。文字列を埋めたくない場合は、単にを使用できますInteger.toBinaryString(b & 0xff)& 0xff修正ネガティブ/ 2の補数の問題
Raekye

8

これはあなたが探しているものですか?

文字列からバイトへの変換

byte b = (byte)(int)Integer.valueOf("10000010", 2);
System.out.println(b);// output -> -126

バイトから文字列への変換

System.out.println(Integer.toBinaryString((b+256)%256));// output -> "10000010"

またはジョアン・シルバは、彼のコメントで言ったように大手追加する0ようなので、文字列の場合には、我々は長さ8の文字列をフォーマットし、ゼロと結果の先頭のスペースを置き換えることができ" 1010"、我々が得ます"00001010"

System.out.println(String.format("%8s", Integer.toBinaryString((b + 256) % 256))
                         .replace(' ', '0'));

5

バイトの各ビットをチェックしてから、文字列に0または1を追加できます。以下は、テスト用に記述した小さなヘルパーメソッドです。

public static String byteToString(byte b) {
    byte[] masks = { -128, 64, 32, 16, 8, 4, 2, 1 };
    StringBuilder builder = new StringBuilder();
    for (byte m : masks) {
        if ((b & m) == m) {
            builder.append('1');
        } else {
            builder.append('0');
        }
    }
    return builder.toString();
}

3

バイトの各ビットを取得して文字列に変換します。たとえば、バイトには8ビットがあり、ビット移動によって1つずつ取得できます。たとえば、バイトの2番目のビットを6ビット右に移動し、2番目のビットを最後に8ビットのビットに移動し、次に(&)を0x0001で移動して前のビットをクリーンアップします。

public static String getByteBinaryString(byte b) {
    StringBuilder sb = new StringBuilder();
    for (int i = 7; i >= 0; --i) {
        sb.append(b >>> i & 1);
    }
    return sb.toString();
}

回答を編集して、このコードが質問に回答する理由を説明してください。コードのみの回答は、解決策を教えていないためお勧めできません。
DavidPostill 2015年

2

このコードは、java intを4つの連続するバイトに分割する方法を示します。次に、Javaメソッドを使用して各バイトを検査し、低レベルのバイト/ビット調査と比較します。

これは、以下のコードを実行したときに予期される出力です。

[Input] Integer value: 8549658

Integer.toBinaryString: 100000100111010100011010
Integer.toHexString: 82751a
Integer.bitCount: 10

Byte 4th Hex Str: 0
Byte 3rd Hex Str: 820000
Byte 2nd Hex Str: 7500
Byte 1st Hex Str: 1a

(1st + 2nd + 3rd + 4th (int(s)) as Integer.toHexString: 82751a
(1st + 2nd + 3rd + 4th (int(s)) ==  Integer.toHexString): true

Individual bits for each byte in a 4 byte int:
00000000 10000010 01110101 00011010

実行するコードは次のとおりです。

public class BitsSetCount
{
    public static void main(String[] args) 
    {
        int send = 8549658;

        System.out.println( "[Input] Integer value: " + send + "\n" );
        BitsSetCount.countBits(  send );
    }

    private static void countBits(int i) 
    {
        System.out.println( "Integer.toBinaryString: " + Integer.toBinaryString(i) );
        System.out.println( "Integer.toHexString: " + Integer.toHexString(i) );
        System.out.println( "Integer.bitCount: "+ Integer.bitCount(i) );

        int d = i & 0xff000000;
        int c = i & 0xff0000;
        int b = i & 0xff00;
        int a = i & 0xff;

        System.out.println( "\nByte 4th Hex Str: " + Integer.toHexString(d) );
        System.out.println( "Byte 3rd Hex Str: " + Integer.toHexString(c) );
        System.out.println( "Byte 2nd Hex Str: " + Integer.toHexString(b) );
        System.out.println( "Byte 1st Hex Str: " + Integer.toHexString(a) );

        int all = a+b+c+d;
        System.out.println( "\n(1st + 2nd + 3rd + 4th (int(s)) as Integer.toHexString: " + Integer.toHexString(all) );

        System.out.println("(1st + 2nd + 3rd + 4th (int(s)) ==  Integer.toHexString): " + 
                Integer.toHexString(all).equals(Integer.toHexString(i) ) );

        System.out.println( "\nIndividual bits for each byte in a 4 byte int:");

        /*
         * Because we are sending the MSF bytes to a method
         * which will work on a single byte and print some
         * bits we are generalising the MSF bytes
         * by making them all the same in terms of their position
         * purely for the purpose of printing or analysis
         */
        System.out.print( 
                    getBits( (byte) (d >> 24) ) + " " + 
                    getBits( (byte) (c >> 16) ) + " " + 
                    getBits( (byte) (b >> 8) ) + " " + 
                    getBits( (byte) (a >> 0) ) 
        );


    }

    private static String getBits( byte inByte )
    {
        // Go through each bit with a mask
        StringBuilder builder = new StringBuilder();
        for ( int j = 0; j < 8; j++ )
        {
            // Shift each bit by 1 starting at zero shift
            byte tmp =  (byte) ( inByte >> j );

            // Check byte with mask 00000001 for LSB
            int expect1 = tmp & 0x01; 

            builder.append(expect1);
        }
        return ( builder.reverse().toString() );
    }

}


2

申し訳ありませんが、これが少し遅れていることを知っています...しかし、私にははるかに簡単な方法があります...バイナリ文字列に:

//Add 128 to get a value from 0 - 255
String bs = Integer.toBinaryString(data[i]+128);
bs = getCorrectBits(bs, 8);

getCorrectBitsメソッド:

private static String getCorrectBits(String bitStr, int max){
    //Create a temp string to add all the zeros
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < (max - bitStr.length()); i ++){
        sb.append("0");
    }

    return sb.toString()+ bitStr;
}

1
String byteToBinaryString(byte b){
    StringBuilder binaryStringBuilder = new StringBuilder();
    for(int i = 0; i < 8; i++)
        binaryStringBuilder.append(((0x80 >>> i) & b) == 0? '0':'1');
    return binaryStringBuilder.toString();
}

0

Javaはunsignedキーワードのようなものは何も提供しないことは誰もが知っています。さらに、byteJavaの仕様によるプリミティブは−128、との間の値を表します127。例えば、場合byteであるcastintJavaが最初に解釈するbitsign、使用する符号拡張。

次に、バイトを127バイナリ文字列表現に変換する方法は?

何も閲覧できないようにしないbyte間の値としてこれらのビットを単純に8ビットを、解釈0して255。また、他人の方法に解釈を強制するためにできることは何もないことを覚えておく必要があります。この方法は、受け入れた場合byte、その方法は、間の値受け付け−128とを127特に明記さない限ります。

したがって、これを解決する最良の方法は、メソッドを呼び出すか、プリミティブとしてキャストすることにより、byte値を値に変換することです。ここに例があります: intByte.toUnsignedInt()int(int) signedByte & 0xFF

public class BinaryOperations
{
    public static void main(String[] args)
    {
        byte forbiddenZeroBit = (byte) 0x80;

        buffer[0] = (byte) (forbiddenZeroBit & 0xFF);
        buffer[1] = (byte) ((forbiddenZeroBit | (49 << 1)) & 0xFF);
        buffer[2] = (byte) 96;
        buffer[3] = (byte) 234;

        System.out.println("8-bit header:");
        printBynary(buffer);
    }

    public static void printBuffer(byte[] buffer)
    {
        for (byte num : buffer) {
            printBynary(num);
        }
    }

    public static void printBynary(byte num)
    {
        int aux = Byte.toUnsignedInt(num);
        // int aux = (int) num & 0xFF; 
        String binary = String.format("%8s', Integer.toBinaryString(aux)).replace(' ', '0');
        System.out.println(binary);
    }
}

出力

8-bit header:
10000000
11100010
01100000
11101010

0

以下の例のようにBigIntegerを操作できます。特に256ビット以上の場合は特にそうです。

String string = "10000010";
BigInteger biStr = new BigInteger(string, 2);

System.out.println("binary: " + biStr.toString(2));
System.out.println("hex: " + biStr.toString(16));
System.out.println("dec: " + biStr.toString(10));

バイトを受け入れる別の例:

String string = "The girl on the red dress.";

byte[] byteString = string.getBytes(Charset.forName("UTF-8"));
System.out.println("[Input String]: " + string);
System.out.println("[Encoded String UTF-8]: " + byteString);

BigInteger biStr = new BigInteger(byteString);
System.out.println("binary: " + biStr.toString(2)); // binary
System.out.println("hex: " + biStr.toString(16));   // hex or base 16
System.out.println("dec: " + biStr.toString(10));  // this is base 10

結果:

[Input String]: The girl on the red dress.
[Encoded String UTF-8]: [B@70dea4e

binary: 101010001101000011001010010000001100111011010010111001001101100001000000110111101101110001000000111010001101000011001010010000001110010011001010110010000100000011001000111001001100101011100110111001100101110
hex: 546865206769726c206f6e20746865207265642064726573732e

バイナリバイト形式に変換することもできます

try {
   System.out.println("binary to byte: " + biStr.toString(2).getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {e.printStackTrace();}

注: バイナリ形式の文字列フォーマットについては、以下のサンプルを使用できます

String.format("%256s", biStr.toString(2).replace(' ', '0'));  // this is for the 256 bit formatting

-1

ここで推測するだけですが、バイトがある場合、オブジェクトでtoString()を呼び出して値を取得できませんでしたか?または、byteValue()を使用してapiをちらっと見ますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.