2016-10-05 3 views
1

У меня есть строка, представляющая число в шестнадцатеричном формате, и я хочу преобразовать ее в base-64. Как это сделать и как это предложение работает? Поскольку мне нужно понять, как это работает.Hex to base-64 и другие базы

Первое, о чем я думал (я ноб), реализующий простой алгоритм, который будет действовать так же, как при работе с ручкой и бумагой, хотя я полагаю, что у Python есть такой «встроенный» материал.

Я могу реализовать это путем поиска в Интернете, однако мне нужно понять, как это работает.

Некоторых примеров вопросов, чтобы дать вам представление о том, объяснениях мне нужно:

  • Если ответ требует строки типа b'...' могли бы вы объяснить, что они и почему b64encode(), кажется, принимают только объекты этот тип в качестве аргументов?
  • Почему int() работает только с базой-36 и как я могу в общем конвертировать рукоятку между различными базами аккуратно, и вы могли бы дать дополнительное объяснение, если ваше решение связано с этой функцией?

Так что если кто-нибудь может дать мне несколько указателей здесь. Я не могу извлечь значительную часть из документации, поскольку этот вид знаний, как представляется, уже ожидается.

Спасибо.

+0

Как быстро предположить, проблема с базой 36 может быть просто кодировкой (26 букв и 10 цифр для кодирования - это все, что вам нужно вывести, используя '10 = A') – AER

+0

Существуют ли какие-либо другие функции, такие как int(), которые я могу использовать для преобразования между основаниями> 36 как лаконично? – scarlett

+0

Что касается вашего вопроса о строках формы 'b" hi scarlett "' см. Этот вопрос: http://stackoverflow.com/questions/6269765/what-does-the-b-character-do-in-front- of-a-string-literal –

ответ

2

Вот код, который ходит вас через процесс преобразования из шестнадцатеричной строки в B64 закодированных строк.

import base64 
x=int('0xABCDEF01',base=16) 
print("x : ",x) 
b=x.to_bytes(length=4,byteorder='big') 
print("b : ",b) 
e=base64.b64encode(b) 
print("e : ",e) 
b2=base64.b64decode(e) 
print("b2 : ",int(b2.hex(),base=16)) 

Выход:

x : 2882400001 
b : b'\xab\xcd\xef\x01' 
e : b'q83vAQ==' 
b2 : 2882400001 

Некоторые (длинные) объяснения: таким образом мы начинаем с гекса в строке, ничего особенного, int берет его вместе с основанием, чтобы превратить его в обычный целое x , Для python x - это куча бит, представляющая число, которое будет печататься в базе 10 большую часть времени. Мы можем запросить представление битов, используя x.to_bytes. Результатом является последовательность байтов, которая будет печататься как b'...'. Обратите внимание, что процесс печати автоматически пытается преобразовать байты в символы ascii или somthing, например \xab, если данный байт не связан с символом ascii.Таким образом, мы затем передаем байты в b64encode, который обычно используется для обработки файлов, следовательно, это требование байтового объекта, и оно вставляет байтовый объект ascii-string в качестве байтового объекта. С этим результатом обратный процесс схож: b64 ascii-string -> двоичное число в байтах -> hex -> int.

+0

'b64encode' возвращает ASCII-строку? Так, например, первый' q' в ' e' является байтом, содержащим значение 113? Для компьютера эта строка отличается от числа, которое оно представляет для нас (число в базе-64)? – scarlett

+0

Цель base64 base64 - взять необработанные байты данных (который не может быть распечатан как ascii) и превратить его в последовательность ascii, которая может быть скопирована/вставлена ​​в текстовое сообщение, чтобы привести пример. Итак ** реальный/ожидаемый вывод b64 - это последовательность символов, которую вы можете прочитать **. Но, как вы уже отметили, для компьютера (и для python) эти символы представляют собой всего лишь последовательность байтов; чтобы python понял, что они действительно являются строкой символов ascii, вам нужно будет называть 'e.decode (« ascii »)'. – jadsq

1

предположить ввод «aaccffdde5e5ff»

import binascii,base64 
input_str = 'aaccffdde5e5ff' 
dehexed_str = binascii.unhexlify(input_str) 
base64_str = base64.b64encode(dehexed_str) 

b'...' просто байтовой строки вы можете кодировать нормальный юникод строку в байты с

as_bytes = u'hello world'.encode('utf-8')

обрабатывать произвольное основание преобразования в base10 увидеть это учебное пособие

http://mathbits.com/MathBits/CompSci/Introduction/tobase10.htm

здесь есть функция, чтобы преобразовать любую строку в любом алфавите для десятичного основания 10

def int10(s,alphabet): 
    base = len(alphabet) 
    return sum([alphabet.index(c)*base**i for i,c in enumerate(s[::-1])]) 

hexAlphabet="abcdef" 
print(int10('f3',hexAlphabet))