кодировка base64 расширенного ascii - PullRequest
0 голосов
/ 01 июня 2018

Я получаю двоичные файлы от устройства IoT.Я пытаюсь преобразовать некоторый идентификатор, состоящий из списка длиной до 13 байтов, в наименьшую возможную читаемую строку.

Для этого я расшифровал его в Base64, а затем преобразовал байты в шестнадцатеричный код так,что

byte[] bytes = {0x24, 0x54, 0x4b, 0x00, 0x31, 0x00, 0x0e, 0x50, 0x33, 0x42, 0x58, 0x35};

становится

4CAD4FDC15F9

Base64 decoding of normal ascii bytes

Однако когда я получаю байты в расширенном ascii (в отладчике байты отображаются как отрицательные значения), преобразование в base64 возвращает пустой массив байтов.

Base64 decoding of extended ascii bytes

Я использовал org.apache.tomcat.util.codec.binary.Base64, который в своей документации упоминает, что он не учитывает расширенные символы ASCII, как указано в документации:

Поскольку этот класс работает непосредственно с байтовыми потоками, а не с символьными потоками, он жестко задан только для * кодирования / декодирования кодировок символов, которые совместимы с нижней таблицей 127 ASCII (ISO-8859-1, Windows-1252), * UTF-8 и т. Д.).


Я также попробовал java.util.Base64, он работает с первым массивом байтов и выдает исключение со вторым массивом байтов :

public static String getBase64HexDeviceIdFromSerialBytes(byte[] serial) {
    byte[] base64Bytes = java.util.Base64.getMimeDecoder().decode(ArrayUtils.subarray(serial, 0, 12));
    String hex = BytesUtils.bytesToHex(base64Bytes);
    return hex;
}

19: 39: 31.946 [main] ОШИБКА com.trackener.backend.api.device.service.DeviceService - сбой при обработке сообщенияdecode0 (Base64.java:734) в java.util.Base64 $ Decoder.decode (Base64.java:526)


Как сделать это преобразование из байтов вэта маленькая строка base64 с этими специальными символами в расширенном ascii? Если бы я мог сделать это с помощью другого метода (чтобы получить уникальный код с как можно меньшим количеством символов из массива байтов), я тоже был бы счастлив.

1 Ответ

0 голосов
/ 01 июня 2018

Вы перепутали кодирование и декодирование.Если у вас есть двоичные данные (8-битные байты), которые вы хотите в «безопасной» форме, вы хотите кодировать их как base64.И как только они закодированы, вам не нужно преобразовывать их в шестнадцатеричные, чтобы отобразить их;Смысл кодирования заключается в том, что результат может быть напечатан ASCII.

public static String getBase64HexDeviceIdFromSerialBytes(byte[] serial) {
    return java.util.Base64.getEncoder().encodeToString(ArrayUtils.subarray(serial, 0, 12));
}
...