Преобразование массива байтов (в шестнадцатеричном формате) в Int. (Котлин / Java) - PullRequest
2 голосов
/ 01 мая 2019

Я смотрю на анализ информации от датчика температуры / влажности, который был снабжен следующими инструкциями;

6 байтов.

  1. Температура положительная / отрицательная: 0 означает положительный (+) и 1 означает отрицательный (-)

  2. Целая часть температуры. Показать в шестнадцатеричном формате.

  3. Десятичная часть температуры. Показать в шестнадцатеричном формате.

  4. Зарезервированный байт. Игнорировать это.

  5. Целая часть влажности. Показать в шестнадцатеричном формате.

  6. Десятичная часть влажности. Показать в шестнадцатеричном формате.

Например: 00 14 05 22 32 08 означает + 20,5C 50,8% и 01 08 09 00 14 05 означает -8,9C 20,5%

, поскольку каждый байт находится в шестнадцатеричном формате, и мне нужно преобразовать его в Int. Я следовал этому подходу - Java-код. Для преобразования байта в шестнадцатеричный , но значения, которые я получаю при проверке их примера, не имеют смысла В Котлине я делаю;

val example = byteArrayOf(0, 14, 5, 22, 32, 8)
example.map { Integer.parseInt(String.format("%02X ", it),16)}

Первый пример вывода:

0 = "00 "
1 = "08 "
2 = "09 "
3 = "00 "
4 = "0E "
5 = "05 "

Второй пример вывода;

0 = "00 "
1 = "0E "
2 = "05 "
3 = "16 "
4 = "20 "
5 = "08 "

Что я делаю не так? Я начинаю думать, что инструкции изготовителей могут вводить в заблуждение

1 Ответ

3 голосов
/ 01 мая 2019

Ключевым моментом, который вам здесь не хватает, является то, что при передаче параметра it в String#format это значение равно десятичное int, а не шестнадцатеричное int.

Вместо этого вы хотите отобразить значение в массиве непосредственно в строку, а затем получить его десятичное значение:

byte it = 14;
int x = Integer.parseInt(String.valueOf(it), 16);
System.out.println(x); // This will print 20

Это должно получить ожидаемый результат.


Обратите внимание, что ваша проблема немного сбивает с толку, потому что числа в вашем байтовом массиве являются десятичными числами ... уже в их шестнадцатеричном «формате».Существует несколько способов устранения этой путаницы (при условии, что вы контролируете тип и / или содержимое массива):

  • Используйте String вместо byte
String it = "14";
int x = Integer.parseInt(it, 16);
System.out.println(x); // This will print 20
  • Сохранять значения в шестнадцатеричном виде и по-прежнему преобразовывать (т. Е. Ставить 0x перед каждым числом)
byte it = 0x14;
int x = Integer.parseInt(String.format("%02X", it), 16);
System.out.println(x); // This will print 20
  • Сохранять значения в шестнадцатеричном видеи не конвертируйте, потому что в этом нет необходимости
byte it = 0x14;
System.out.println(it); // This will print 20

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...