Конвертировать гекс в INT 32 и STRING Little Endian - PullRequest
1 голос
/ 21 февраля 2020

Первый вопрос:

Шестнадцатеричный: F1620000

После конвертации гекса в INT 32 я ожидаю 253229, но я получаю -245235712. Я пробовал эти методы:

Integer.parseUnsignedInt(value, 16));
(int)Long.parseLong(value, 16));
new BigInteger(value, 16).intValue());

Как я могу получить правильное значение?

Второй вопрос:

Hex: 9785908D9B9885828020912E208D2E

После скрытого гекса в STRING я могу получить это значение:

\u0097\u0085\u0090\u008d\u009b\u0098\u0085\u0082\u0080 \u0091. \u008d.

Как правильно отобразить это значение в json? (используя JSONObject).

StringBuilder result = new StringBuilder();
  for (int i = 0; i < value.length(); i += 2) {
    String str = value.substring(i, i + 2);
      result.append((char)Integer.parseInt(str, 16));
  }

1 Ответ

2 голосов
/ 21 февраля 2020

Все ваши попытки достаточны для разбора шестнадцатеричной строки в беззнаковой интерпретации, но не учитывают представление «little-endian». Вы должны повернуть байт-код вручную:

String value = "F1620000";
int i = Integer.reverseBytes(Integer.parseUnsignedInt(value, 16));
System.out.println(i);
25329

Для вашего второго задания отсутствовала информация о том, как интерпретировать байты, чтобы получить содержимое символа. После небольшого поиска кодовая страница 866 представляется наиболее вероятной кодировкой:

String value = "9785908D9B9885828020912E208D2E";
byte[] bytes = new BigInteger(value, 16).toByteArray();
String result = new String(bytes, bytes[0]==0? 1: 0, value.length()/2, "CP866");
ЧЕРНЫШЕВА С. Н.
...