Как преобразовать двоичную строку в массив байтов 2 байта в java

у меня есть двоичная строка String A = "1000000110101110". Я хочу, чтобы преобразовать эту строку в байтовый массив длиной 2 в java

Я принял помощь этой ссылке

Я пытался преобразовать его в байт различными способами

  1. Я сначала преобразовал эту строку в 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);
}