108

たとえば、バイトのビットは です。ビットを文字通り文字列に割り当てるにB10000010どうすればよいですか。strつまり、str = "10000010".

編集

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

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

(b) ビットが で始まる場合0、出力は無視0されます。たとえば、B[0]00000001 があると仮定すると、出力は1代わりに00000001

4

14 に答える 14

198

使用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

デモ

于 2012-09-07T00:03:52.773 に答える
39

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

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

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

&バイトを整数にアップキャストします。その時点で、それは0- 255(00000000から まで11111111、先頭の 24 ビットを除外しました) のいずれかになります。先行ゼロがあること+ 0x100を確認します。.substring(1)

João Silva's answerと比較して時間を計りましたが、これは 10 倍以上高速です。http://ideone.com/22DDK1適切にパディングされないため、Pshemo の回答は含めませんでした。

于 2013-07-05T20:52:51.210 に答える
10

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

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

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

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

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

または、João Silva がコメントで先頭0を追加するように言ったように、文字列を長さ 8 にフォーマットし、結果の先頭のスペースをゼロに置き換えることができるため、次のような文字列の場合は次のよう" 1010"になります。"00001010"

System.out.println(String.format("%8s", Integer.toBinaryString((b + 256) % 256))
                         .replace(' ', '0'));
于 2012-09-07T00:19:10.587 に答える
6

バイトの各ビットを取得し、文字列に変換します。バイトが 8 ビットで、ビット移動によって 1 つずつ取得できるとします。たとえば、バイトの 2 番目のビットを 6 ビット右に移動し、2 番目のビットを 8 ビットのビットの最後に移動し、次に 0x0001 で and(&) を実行して前のビットを消去します。

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();
}
于 2015-03-21T04:26:26.810 に答える
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() );
    }

}
于 2013-10-20T16:55:29.613 に答える
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;
}
于 2016-02-17T21:19:47.507 に答える
2
Integer.toBinaryString((byteValue & 0xFF) + 256).substring(1)
于 2018-05-25T13:03:33.187 に答える
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();
}
于 2015-05-09T20:25:13.657 に答える
0

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

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

byteを単純に 8 ビットとして表示し、それらのビットを ~ の間の値として解釈することを妨げるものは何もありませ0255。また、他人の方法に自分の解釈を強制するためにできることは何もないことを覚えておく必要があります。メソッドが を受け入れる場合、特に明記されていない限り、そのメソッドはとbyteの間の値を受け入れます。−128127

したがって、これを解決する最善の方法は、メソッドを呼び出すか、プリミティブとしてキャストして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
于 2019-07-03T08:56:31.220 に答える
-1

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

于 2012-09-07T00:00:44.210 に答える