Ошибка b64encode требуется байтоподобный объект, а не ‘str’ python3

#python #python-3.x #token

#python #python-3.x #токен

Вопрос:

Я получаю сообщение об ошибке при преобразовании base 64 в python, я не могу найти решение

 uniq_token_hash = hashlib.sha256(uniq_token_string.encode('UTF-8')).hexdigest()
print ('UNIQ HASH: %s' % uniq_token_hash)
auth_token = b64encode('%s;%s;%s' % (devapp,unix_timestamp, uniq_token_hash))
print ('AUTH TOKEN: %s' % auth_token)

line 58, in b64encode
    encoded = binascii.b2a_base64(s, newline=False)
TypeError: a bytes-like object is required, not 'str'
 

Ответ №1:

В Python есть два вида строк. Первый состоит из кодовых точек (символов) в Юникоде, и он вызывается str . Второй — это последовательность байтов (небольшие целые числа от 0 до 255), и он вызывается bytes . b64encode требуется bytes в качестве входных данных. Вы уже знаете, как преобразовать str в bytes , потому что вы сделали это один раз .encode .

 auth_token = b64encode(('%s;%s;%s' % (devapp,unix_timestamp, uniq_token_hash)).encode('UTF-8'))
 

Ответ №2:

Вы должны перенести строку UTF-8 в простой байтовый массив, вы можете изменить строку на байтовый массив с помощью следующего кода

 old_string = "string"
byte_array = old.string.encode()
# returns b'string'
new_string = byte_array.decode()
 

В последней версии Python я бы использовал f’string . Может быть, использовать что-то вроде этого:

 byte_array = f'{devapp};{unix_timestamp};{uniq_token_hash}'.encode()
auth_token = b64encode(byte_array)
 

Пожалуйста, имейте в виду, что вы должны тщательно обрабатывать кодирование и хорошо знать, что и как вы храните.