Мне нужно преобразовать список типа byte например [-1,8,0,0] в int например 263... Попробовал вот такой метод
ByteBuffer.wrap(input).order(ByteOrder.LITTLE_ENDIAN).getInt()
И вроде всё работает,до тех пор пока выходной int не превышает 127...после чего происходит что-то странное и этот метод начинает возвращать странные значения,намного выше требуемых...
Для того что бы ТС понял почему у него не выходит получить 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 |
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите пожалуйста, как можно генерировать отчёты в Intellij Idea помимо JasperЕго использовать не получается
Нужно в массиве найти: максимальную длину без нулей, индекс первого эл-та исчисления максимальной длины
Первый TextField работает как надо, с остальными что-то не так, они не редакируются
Моя программа из углов Эейлера, которые хранятся в виде трехкомпонентного вектора A(Ax, Ay, Az), получает матрицу поворота порядка ZXY (умножение...