Java SE, корректная запись строки байтовых символов в байтовый массив

188
04 мая 2018, 13:46

Имеется Строка String Packet в которой записываетются данные а-ля FA0023CC и массив byte[] P = new byte[Packet.length()/2]в который нужно загнать данные по типу 0xFA 0x00 0x23 0xCC Пишу байты таким способом:

P[i]= (byte)  ((Character.digit(Packet.charAt(i*2), 16) << 4) + Character.digit(Packet.charAt(i*2+1), 16));

где i - номер байта, всё считывается корректно пока не сталкиваюсь с байтами больше 7F, начиная с 80 они почему то становятся отрицательтными и идут в обратную сторону (если переводить 0х80, 0х81, 0х82 в int, то будет не 128, 129, 130, а -128, -127, -126 и т.д.)

Answer 1

Поскольку вы сравниваете тип byte с типом int, то для чисел больше 127 возникает следующая проблема - несмотря на внешнюю похожесть, это разные числа:

  • число FF типа byte это -1 (двоичное представление - 11111111).
  • число FF типа int (тип чисел по умолчанию) это 255 (двоичное представление - 24нуля11111111).

Решить проблему можно двумя способами:

  1. Конвертировать byte в int, т.е. дописать спереди 24 нуля. В данном случае особого смысла нет, потому что нас интересуют только отрицательные числа, а с ними как раз и будет заморока.
  2. Конвертировать int в byte (т.е. попросту отбросить первые 24 нуля). Вот так:

    (P[i] == (byte) 0xFF)

READ ALSO
Как создать переменную int из выражения?

Как создать переменную int из выражения?

Можно ли сделать одну int переменную из listget(count-1))

205
CyclePagerIndicator чем заменить?

CyclePagerIndicator чем заменить?

CyclePagerIndicator в проект добавить нужноНа гитхабе и вообще нашел лишь зависимость к мавен

209
Дата прописью в java

Дата прописью в java

Как вывести дату словами в Java?

189
Как ускорить запросы в БД JDBC

Как ускорить запросы в БД JDBC

Имеется 2 мапы, в одной 120 элементов, в другой 40Идет перебор, то есть сначала перебираются все элементы мапы 2 с первым элементом первой мапы,...

207