Метод fundametal для преобразования гекса в base64 в python3 - PullRequest
0 голосов
/ 03 октября 2018

Я хочу преобразовать данный гекс в base64 (в python без использования каких-либо библиотек ).Как я узнал из других ответов в стеке, мы можем сгруппировать 3 шестнадцатеричных символа (12 бит, т.е. 4 бита каждый), чтобы получить 2 значения base64 (12 бит, т.е. 6 бит каждый).А также мы можем сгруппировать 6 шестнадцатеричных (24 бита) в 4 значения base64 (24 бита).

Стандартная процедура состоит в том, чтобы сложить все двоичные биты шестнадцатеричных кодов вместе и начать группировку слева в пакеты по 6.

Мой вопрос касается ситуации, для которой нам нужно заполнение: (Предполагая, что мыпреобразование 3 шестнадцатеричных в 2 base64) Возникнет ситуация, когда нам останется только 2 или 1 шестнадцатеричное значение для преобразования.Возьмите приведенный ниже пример:

от 'a1' до base64

10100001 (двоичный файл из a1)

101000 01 (0000) //создание групп по 6 и добавление дополнительных 0 в случае необходимости

Это дает "oQ" ответ, который находится в каком-то месте (oQ ==) и что-то другое в других place (wqE =)

Q1. Какой из двух источников дает правильный ответ?Почему другой плох, будучи хорошим онлайн-декодером?

Q2. Как мы понимаем число '=' здесь?(Мы могли бы просто добавить достаточное количество нулей в любом месте, где это необходимо, как в примере выше, и, таким образом, завершив ответ здесь просто oQ, а не oQ ==, предполагая, что oQ == является правильным)

Моя концепция таковачто: если гекс имеет длину 2 (а не 3), мы дополняем его одним = (следовательно, соответствует ответу wqE = в вышеприведенном случае), в противном случае, если гекс имеет длину 1 (а не 3), мы дополняемdouble = 's .

В то же время я смущен тем, что, если 3 гекса преобразуется в 2 base64, нам никогда не понадобятся два ='.

'a' в base64

1010 (двоичное из a)

Q3. Как преобразовать шестнадцатеричный 'a' в base64,

1 Ответ

0 голосов
/ 04 октября 2018

Base64 определяется RFC 4648 как «предназначенный для представления произвольных последовательностей октетов».Октет представляет собой 8-битную единицу, практически синонимичную с байтом.Когда ваш ввод находится в форме шестнадцатеричной строки, ваш первый шаг должен состоять в том, чтобы декодировать его в строку байтов.Вам нужно два шестнадцатеричных символа для каждого байта.Если длина ввода нечетная, разумным решением будет выдать ошибку.

Чтобы ответить на пронумерованные вопросы:

Q1: Даже когда вы собираетесь реализовать свой собственный кодер, выможет использовать стандартную библиотеку Python для расследования.Декодирование двух результатов обратно в байты дает:

>>> import base64
>>> base64.b64decode(b'oQ==')
b'\xa1'
>>> base64.b64decode(b'wqE=')
b'\xc2\xa1'

Таким образом, oQ== является правильным, в то время как wqE= имеет добавленный байт c2.Я могу предположить, что это результат применения кодировки UTF-8 до Base64.Для подтверждения:

>>> '\u00a1'.encode('utf-8')
b'\xc2\xa1'

Q2: правила заполнения подробно изложены в RFC .

Q3: Это неоднозначно, и вы правы, что вас путают.

...