Как преобразовать двоичную строку в массив байтов 2 байта в java
у меня есть двоичная строка String A = "1000000110101110"
. Я хочу, чтобы преобразовать эту строку в байтовый массив длиной 2 в java
Я принял помощь этой ссылке
Я пытался преобразовать его в байт различными способами
-
Я сначала преобразовал эту строку в decimal, а затем применил код для хранения в массив байтов
int aInt = Integer.parseInt(A, 2); byte[] xByte = new byte[2]; xByte[0] = (byte) ((aInt >> 8) & 0XFF); xByte[1] = (byte) (aInt & 0XFF); System.arraycopy(xByte, 0, record, 0, xByte.length);
но значения get store в массив байтов отрицательный
xByte[0] :-127
xByte[1] :-82
неправильных значений.
2.Я также попытался использовать
byte[] xByte = ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putInt(aInt).array();
но он бросает исключение в вышеуказанную строку, как
java.nio.Buffer.nextPutIndex(Buffer.java:519) at
java.nio.HeapByteBuffer.putInt(HeapByteBuffer.java:366) at
org.com.app.convert.generateTemplate(convert.java:266)
что мне теперь делать, чтобы преобразовать двоичную строку в массив байтов 2 байта?Есть ли встроенная функция в java
чтобы получить массив байтов
4 ответов
ответ, который вы получаете
xByte[0] :-127
xByte[1] :-82
- Это верно.
Это называется 2 комплимент Represantation. 1-й бит используется как бит со знаком.
0 for +ve
1 for -ve
если 1-й бит равен 0, чем он рассчитывает, как и обычные. но если 1-й бит равен 1, то он вычитает значения 7 бит из 128 и какой бы ответ ни был представлен в форме-ve.
в вашем случае
1-е значение10000001
т. 1(1-ый бит) к -ве и 128 - 1(последние семь бит) = 127
поэтому значение -127
для более подробной информации прочитайте представление дополнения 2.
использовать putShort
для ввода двухбайтового значения. int
имеет четыре байта.
// big endian is the default order
byte[] xByte = ByteBuffer.allocate(2).putShort((short)aInt).array();
кстати, ваша первая попытка идеальна. Вы не можете изменить отрицательный знак байтов, так как установлен самый значительный бит этих байтов. Это всегда интерпретируется как отрицательное значение.
10000001₂ == -127
10101110₂ == -82
попробуй такое
String s = "1000000110101110";
int i = Integer.parseInt(s, 2);
byte[] a = {(byte) ( i >> 8), (byte) i};
System.out.println(Arrays.toString(a));
System.out.print(Integer.toBinaryString(0xFF & a[0]) + " " + Integer.toBinaryString(0xFF & a[1]));
выход
[-127, -82]
10000001 10101110
то есть -127 == 0xb10000001 и -82 == 0xb10101110
байт подписаны 8 битных чисел. Таким образом, ваш результат совершенно правильный. То есть: 01111111 - 127, а 10000000 - -128. Если вы хотите получить числа в диапазоне 0-255, вам нужно использовать больший тип переменной, такой как short.
вы можете напечатать байт как беззнаковый, как это:
public static String toString(byte b) {
return String.valueOf(((short)b) & 0xFF);
}