바이트를 이진 문자열 표현으로 변환하는 방법


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


2
혼란 스럽습니다. 이게 속임수인가요?
Dave Newton

1
a byte를 기본 2의 문자열 로 변환하는 방법을 묻고 있습니까?
SLaks

난 그냥 작동 (이진수의 값을 문자열로 변환)이 작업을 수행하는 다른 스레드에 대한 답변을 추가 Boolean, Byte, Short, Char, Int,와 Long. stackoverflow.com/a/54950845/501113
chaotic3quilibrium

8의 너비를 사용하도록 지시 한 경우 String # Format ()이이를 처리 할 수 ​​있습니다. 마찬가지로 System.out.printf ().
NomadMaker

답변:


170

사용 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]하면 음의 정수 값으로 변환되기 때문에 출력이 올바르지 않습니다 . (b) 비트가 0으로 시작하는 경우 출력은 무시 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')하여 결과 문자열을 0으로 채움 으로써 쉽게 수정할 수 있습니다 .
João Silva

1
@ João : 조언에 감사드립니다. (a)를 처리하는 방법, 원래 비트 형식 (1로 시작)을 문자열에 저장하는 방법에 대해 알고 있습니까?
Sean

1
예, 단지 : @Sean &함께 0xFF.
João Silva

12
@Sean : & 0xFF기본적으로 a signed byteunsigned integer. 예를 들어, -129말씀하신 것처럼는로 표시됩니다 11111111111111111111111110000001. 이 경우, 당신은 기본적으로, 첫 번째 (최하위) 8 개 비트를 원하는 그래서 당신과 ( &와) 그것을 0xFF( 00000000000000000000000011111111), 우리는 걱정하지 않는 것이 효율적으로, 왼쪽에 하나의 청소를 그냥 떠나 10000001.
João Silva

33

나는 이것을 사용했다. 다른 답변과 비슷한 아이디어이지만 어디서나 정확한 접근 방식을 보지 못했습니다. :)

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

0xFF255 또는 11111111(부호없는 바이트의 최대 값)입니다. 0x100256 또는100000000

&정수로 바이트 업 캐스팅. 이 시점에서 0- 255( 00000000~ 11111111, 선행 24 비트를 제외했습니다) 에서 무엇이든 될 수 있습니다 . + 0x100.substring(1)선행 0이 될 것입니다 보장합니다.

나는 João Silva의 답변 과 비교하여 시간을 측정 했으며 이것은 10 배 이상 빠릅니다. http://ideone.com/22DDK1 Pshemo의 대답은 제대로 패딩되지 않아 포함하지 않았습니다.


야! 이것에 대해 질문이 있습니다. PDF의 Base64 표현 문자열이 있습니다. 바이너리로 변환해야합니다. 기본적으로 Base64-> byte-> binary.이 코드가 작동할까요?
Sid

+ 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 문자열을 포맷하고 0으로 결과 선행 공백을 대체 할 수있는 " 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 비트가 있다고 가정하면 비트 이동을 통해 하나씩 얻을 수 있습니다. 예를 들어, 바이트의 두 번째 비트를 6 비트 오른쪽으로, 두 번째 비트를 8 비트의 마지막 비트로 이동 한 다음, and (&)를 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

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();
}

1

아래 예제와 같이 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

간단한 대답은 다음과 같습니다.

System.out.println(new BigInteger(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})); // 0
System.out.println(new BigInteger(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1})); // 1
System.out.println(new BigInteger(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0})); // 256
System.out.println(new BigInteger(new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0})); // 65536
System.out.println(new BigInteger(new byte[]{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0})); // 16777216
System.out.println(new BigInteger(new byte[]{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0})); // 4294967296
System.out.println(new BigInteger(new byte[]{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0})); // 1099511627776
System.out.println(new BigInteger(new byte[]{0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0})); // 281474976710656
System.out.println(new BigInteger(new byte[]{0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0})); // 72057594037927936
System.out.println(new BigInteger(new byte[]{0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0})); // 18446744073709551616
System.out.println(new BigInteger(new byte[]{0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0})); // 4722366482869645213696
System.out.println(new BigInteger(new byte[]{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})); // 1208925819614629174706176
System.out.println(Long.MAX_VALUE);                                              // 9223372036854775807

0

우리 모두는 Java가 unsigned 키워드와 같은 것을 제공하지 않는다는 것을 알고 있습니다. 또한 byteJava의 사양에 따른 기본 형식은 −128과 사이의 값을 나타냅니다 127. 예를 들어,이 경우 byte입니다 castint자바 첫 번째 해석합니다 bit는 AS sign및 사용 부호 확장.

그런 다음보다 큰 바이트 127를 이진 문자열 표현 으로 변환하는 방법 ??

아무것도 시청에서 당신을 방해하지 않습니다 byte사이의 값으로 그 비트를 단순히 8 비트를 해석 0하고 255. 또한 다른 사람의 방법에 대한 해석을 강요하기 위해 할 수있는 일이 없다는 것을 명심해야합니다. 이 방법을 수락하면 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

-1

여기서 추측하지만 Byte가있는 경우 값을 얻기 위해 객체에서 toString ()을 호출 할 수 없습니까? 또는 byteValue ()를 사용하여 api를 살펴 보 시겠습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.