2016-03-30 6 views
1

Я пытаюсь использовать base-64 для кодировки шестнадцатеричной строки (скопировано ниже), но значения, которые я получаю от вызова Java8 для кодирования на base64, не соответствуют тому, что я получаю на разных онлайн-конвертеры. Я пытаюсь выяснить, какие шаги мне не хватает (или оплошности я беру):Как base-64 закодировать шестнадцатеричную строку

//hexString is 07050600030102 
Base64.getEncoder().encodeToString(hexString.getBytes(StandardCharsets.UTF_8)); 

//output I am getting from Java8 ic copied below: 
MDcwNTA2MDAwMzAxMDI= 

//online converters: 
BwUGAAMBAg== 
+0

Он кодирует символьные данные (а не числовое значение) в качестве base64. Если вы хотите использовать шестнадцатеричное значение, сначала нужно разобрать его как число. – resueman

+0

Скорее всего, вам нужно декодировать hexidecimal и кодировать то, что вы получили, а не кодировать его как base64. –

ответ

5

Это не делать то, что вы ожидаете его:

hexString.getBytes(StandardCharsets.UTF_8) 

Это просто кодирующий шестнадцатеричную строку как UTF-8 - вы хотите разобрать шестнадцатеричную строку, так что каждая пара шестнадцатеричных цифр заканчивается как один байт. Тот факт, что результат base64 отличается от того, что байты, которые вы кодируете base64, различны.

Для разбора шестнадцатеричной строки в байтах, вы можете использовать Guava (среди других библиотек)

byte[] bytes = BaseEncoding.base16().decode(hexString); 
String base64 = BaseEncoding.base64().encode(bytes); 
+0

, если вы используете 'BaseEncoding' в одном направлении, вы можете также использовать его в обоих:' BaseEncoding.base64(). Encode (BaseEncoding.base16(). Decode (hexString)) '. –

+0

@LouisWasserman: Хорошая точка :) Исправит. –

+0

спасибо, Джон, я скоро приму. Спасибо всем, кто прокомментировал - высоко оценил –

2

ответ Джона правильно, но я думал, что я хотел бы сделать попытку объяснить это немного по-другому. Я считаю, что кодирование/декодирование может быть немного запутанным время от времени.

Когда вы говорите, что ваши данные закодированы как «шестнадцатеричная строка», эти данные сделаны «довольно печатаемыми». Фактически, «шестнадцатеричное кодирование» - это самая простая вещь, которую вы можете сделать для любых двоичных данных, если вы должны ее распечатать. С шестнадцатеричным кодированием никакие двоичные данные не подлежат печати (в компьютерных системах, о которых мы знаем)!

Чтобы сделать его более понятным, допустим, кто-то дает вам строку с шестнадцатеричным кодированием 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}.

Смежные вопросы