Мне нужно преобразовать список типа 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 |
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости