ответ Джона правильно, но я думал, что я хотел бы сделать попытку объяснить это немного по-другому. Я считаю, что кодирование/декодирование может быть немного запутанным время от времени.
Когда вы говорите, что ваши данные закодированы как «шестнадцатеричная строка», эти данные сделаны «довольно печатаемыми». Фактически, «шестнадцатеричное кодирование» - это самая простая вещь, которую вы можете сделать для любых двоичных данных, если вы должны ее распечатать. С шестнадцатеричным кодированием никакие двоичные данные не подлежат печати (в компьютерных системах, о которых мы знаем)!
Чтобы сделать его более понятным, допустим, кто-то дает вам строку с шестнадцатеричным кодированием a9
(идея такая же, как у вашего 07050600030102
). Это означает, что при интерпретации определенного байтового потока в виде шестнадцатеричных символов он становится a9
. Поскольку каждый из шестнадцатеричных символов: [0-9][a-f]
может быть закодирован как полубайт 0000
по 1111
, вы можете декодировать фактические биты как: 1010 1001
(пробел используется для краткости). Итак, что такое шестнадцатеричное кодирование, как a9
, фактически представляет собой один байт 10101001
.
Итак, если вы должны были теперь «base64-encode», вы должны использовать 10101001
в качестве входа! В терминах байтового массива это будет: {-87}
, потому что -87
- это десятичное значение битовой последовательности 10101001
в двухзначном представлении целочисленных значений в Java.
Когда вы делаете: hexString.getBytes(StandardCharsets.UTF_8)
или hexString.getBytes()
(если кодировка по умолчанию UTF-8
на вашем компьютере), то вы собираетесь получить байты hexString
интерпретированы в соответствии с UTF-8
кодирования и с этого кодирования имеет обратную совместимость с ASCII кодирование, то, что вы получите это массив 2-байт, первый байт которого является десятичной 97
(или двоичный 01100001
), представляющий характер 'a'
, а второй байт десятичного 57
(или двоичный 00111001
), представляющий характер '9'
(десятичное число 9). Таким образом, массив байтов, который вы получите от вызова getBytes()
, составляет: {97, 57}
.
Как вы можете видеть, эти две вещи разные. Вы хотите base64-кодировать байты, представленные массивом {-87}
, но вы заканчиваете байты с кодировкой base64, представленные массивом {97, 57}
.
Он кодирует символьные данные (а не числовое значение) в качестве base64. Если вы хотите использовать шестнадцатеричное значение, сначала нужно разобрать его как число. – resueman
Скорее всего, вам нужно декодировать hexidecimal и кодировать то, что вы получили, а не кодировать его как base64. –