Как преобразовать полную строку ASCII в шестнадцатеричный в Python? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть эта строка: string = '{'id':'other_aud1_aud2','kW':15}'

И, проще говоря, я бы хотел, чтобы моя строка превратилась в шестнадцатеричную строку, подобную этой: '7b276964273a276f746865725f617564315f61756432272c276b57273a31357d'

Пытался binascii.hexlify(string), но он продолжает возвращаться:

TypeError: требуется объект, похожий на байты, а не 'str'

Кроме того, он работает только с помощью следующего метода: bytearray.fromhex(data['string_hex']).decode()

Для всего кода здесь это:

string_data = "{'id':'"+self.id+"','kW':"+str(value)+"}"
print(string_data)
string_data_hex = hexlify(string_data)
get_json = bytearray.fromhex(data['string_hex']).decode()

Также это Python 3.6

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Хитрость в том, что строка Python 3 - это последовательность символов Unicode, которая не совпадает с последовательностью символов ASCII.

  • В Python2 str type и bytes type являются синонимами, и существует отдельный тип unicode, представляющий последовательность символов Unicode.Это делает загадкой, если у вас есть строка: это последовательность байтов или последовательность символов в некотором наборе символов?

  • В Python3, str теперь означает unicode, и мы используем bytes для того, что раньше было str.Для данной строки - последовательности символов Unicode - мы используем encode для преобразования ее в некоторую байтовую последовательность, которая может ее представлять, , если существует такая последовательность:

    >>> 'hello'.encode('ascii')
    b'hello'
    >>> 'sch\N{latin small letter o with diaeresis}n'
    'schön'
    >>> 'sch\N{latin small letter o with diaeresis}n'.encode('utf-8')
    b'sch\xc3\xb6n'
    

    но:

    >>> 'sch\N{latin small letter o with diaeresis}n'.encode('ascii')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character '\xf6' in position 3: ordinal not in range(128)
    

Когда у вас есть объект bytes, вы уже знаете, что делать.В Python2, если у вас есть str, у вас есть bytes объект;в Python3 используйте .encode с выбранной кодировкой.

0 голосов
/ 04 декабря 2018

Вы можете encode() строка:

string = "{'id':'other_aud1_aud2','kW':15}"
h = hexlify(string.encode())
print(h.decode())
# 7b276964273a276f746865725f617564315f61756432272c276b57273a31357d

s = unhexlify(hex).decode()
print(s) 
# {'id':'other_aud1_aud2','kW':15}
...