Преобразование byte[] в int

174
30 января 2022, 22:20

Мне нужно преобразовать список типа byte например [-1,8,0,0] в int например 263... Попробовал вот такой метод

ByteBuffer.wrap(input).order(ByteOrder.LITTLE_ENDIAN).getInt()

И вроде всё работает,до тех пор пока выходной int не превышает 127...после чего происходит что-то странное и этот метод начинает возвращать странные значения,намного выше требуемых...

Answer 1

Для того что бы ТС понял почему у него не выходит получить 263 с представленными данными, я напишу ответ такой, что бы можно было понять как происходит преобразование.

Представление целого в двоичной системе счисления:

|  1 byte   |  2 byte   |  3 byte   |  4 byte   |
------------------------------------------------- [0]
| 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 |

Где нули, это биты, не байты! Значение бита это 0 / 1 (как кнопка вкл/выкл)

Представление числа 255 в двоичной системе выглядит так:

|  1 byte   |  2 byte   |  3 byte   |  4 byte   |
------------------------------------------------- [255]
| 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111 |

Байт же, это кусочек целого:

|  1 byte   |
------------- [255]
| 1111 1111 |

Когда вы разбиваете целое на такие 4 кусочка, у вас не будет такого, что вы сложили эти 4 байта вместе и получили исходное число. (255 * 4 = 1 020 когда диапазон uint32 = 4 294 967 295)

Далее, когда вы так сказать вынули из целого 4 байта, т.е. разбили его на 4 байта, то вам необходимо вернуть эти байты на место что бы получить исходное число (при перемешке байт результат будет не тот который ожидался), а делается это с использованием сдвигов, т.е. вы берете и с конца заполняете битовые поля т.е.:

|  1 byte   |  2 byte   |  3 byte   |  4 byte   |
------------------------------------------------- [0]
| 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 |
<< 24 сдвиг на 24 бита влево
          0 < 24 бит (можете сами посчитать)
| 0000 0000 |

Далее, когда вы заполнили первые 8 бит (byte == 8 bit) нужно отнять 24 - 8 == 16 И сделать тоже самое со вторым байтом:

|  1 byte   |  2 byte   |  3 byte   |  4 byte   |
------------------------------------------------- [0]
| 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 |
<< 16 сдвиг на 16 бит влево
                      0 < 16 бит
            | 0000 0000 |

3й байт:

|  1 byte   |  2 byte   |  3 byte   |  4 byte   |
------------------------------------------------- [0]
| 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 |
<< 8 сдвиг на 8 бит влево
                                  0 < 8 бит
                        | 0000 0000 |

4й:

|  1 byte   |  2 byte   |  3 byte   |  4 byte   |
------------------------------------------------- [0]
| 0000 0000 | 0000 0000 | 0000 0000 | 0000 0000 |
<< 0 (или & num) сдвиг на 0 бит влево
                                              0 < 0 бит
                                    | 1111 1111 |
-------------------------------------------------
| 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111 | [255]

Только так можно получить обратно то целое число которое вы разбили на байты.

В то время как вы в вопросе привели следующие данные:

|  1 byte   |  2 byte   |  3 byte   |  4 byte   |
------------------------------------------------- [-16 252 928]
| 1111 1111 | 0000 1000 | 0000 0000 | 0000 0000 |
READ ALSO
Чем создавать отчёты

Чем создавать отчёты

Подскажите пожалуйста, как можно генерировать отчёты в Intellij Idea помимо JasperЕго использовать не получается

67
Найти ошибки в коде

Найти ошибки в коде

Нужно в массиве найти: максимальную длину без нулей, индекс первого эл-та исчисления максимальной длины

65
TextField vaadin java

TextField vaadin java

Первый TextField работает как надо, с остальными что-то не так, они не редакируются

140
Нахождения углов Эйлера из вектора направления

Нахождения углов Эйлера из вектора направления

Моя программа из углов Эейлера, которые хранятся в виде трехкомпонентного вектора A(Ax, Ay, Az), получает матрицу поворота порядка ZXY (умножение...

112