Как преобразовать байт в двоичное строковое представление
например, биты в байте B
are 10000010
, Как я могу назначить биты в строку str
в буквальном смысле, то есть str = "10000010"
.
Edit
я читаю байт из двоичного файла, и хранится в массиве байтов B
. Я использую System.out.println(Integer.toBinaryString(B[i]))
. проблема в том
(a) когда биты начинаются с (крайнего левого) 1, Вывод не является правильным, потому что он преобразует B[i]
к отрицательному значению int.
(b) если биты начинаются с 0
выход игнор 0
, например, предположить B[0]
имеет 00000001, выход 1
вместо 00000001
10 ответов:
использовать
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
демо.
я использовал это. Аналогичная идея с другими ответами, но нигде не видел точного подхода:)
System.out.println(Integer.toBinaryString((b & 0xFF) + 0x100).substring(1));
0xFF
равно 255, или11111111
(максимальное значение для беззнакового байта).0x100
- это 256 или100000000
The
&
преобразует байт в целое число. В этот момент, это может быть что угодно от0
-255
(00000000
до11111111
, Я исключил ведущие 24 бита).+ 0x100
и.substring(1)
убедитесь, что там будут нули.я приурочил его по сравнению к ответ Жоао Сильвы, а это более чем в 10 раз быстрее. http://ideone.com/22DDK1 я не включил ответ Пшемо, поскольку он не заполняется должным образом.
это то, что вы ищете?
//converting from String to byte Byte b= (byte)(int)Integer.valueOf("10000010", 2); System.out.println(b);// output -> -126 //converting from byte to String System.out.println(Integer.toBinaryString((b+256)%256));// output -> "10000010"
или как сказал Жоао Силва в своем комментарии
System.out.println(String.format("%8s", Integer.toBinaryString((b + 256) % 256)).replace(' ', '0'));
этот код продемонстрирует, как 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() ); } }
вы можете проверить каждый бит на байте, а затем добавить либо 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(); }
сделать каждый бит байта и преобразовать в строку. Скажем, байт имеет 8 бит, и мы можем получить их один за другим с помощью битового перемещения. Например, мы перемещаем второй бит байта 6 бит вправо, второй бит, наконец, бит 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(); }
Извините, я знаю, это немного поздно... Но у меня есть гораздо более простой способ... В двоичную строку :
//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 str to add all the zeros String tmpStr = ""; for(int i = 0; i < (max - bitStr.length()); i ++){ tmpStr += "0"; } return tmpStr + bitStr; }
просто угадать здесь, но если у вас есть байт, то не могли бы вы просто вызвать toString() на объект, чтобы получить значение? Или, взглянув на api, используя byteValue()?