2014-11-19 6 views
8

У меня есть байты объекта:Python3 байт в шестнадцатеричной строки

a = b'067b' 

Как получить строку из него? Как это:

"067b" 

Я пробовал:

In [3]: str(a) 
Out[3]: "b'067b'" 

In [4]: import codecs 

In [5]: codecs.decode(a,'hex') 
Out[5]: b'\x06{' 

In [6]: import binascii 

In [7]: binascii.b2a_hex(a) 
Out[7]: b'30363762' 

In [8]: binascii.hexlify(a) 
Out[8]: b'30363762' 

Есть ли никакого способа сделать это?

ответ

8

Вы просто хотите, чтобы декодировать из ASCII здесь, ваша байтовая строкой является уже представляющей шестнадцатеричных чисел в ASCII-символах:

>>> a = b'067b' 
>>> a.decode('ascii') 
'067b' 

Все, что вы пытались это интерпретировать байты как числовые данные вместо этого, либо в виде шестнадцатеричных чисел представляющие байты или как байты, представляющие числовые данные.

Так что ваша первая попытка принимает значение 06 как шестнадцатеричное число и получается, что в значение байта 6 и 7b включена в стоимость байт 123, который является ASCII элемент коды для { характера.

Во второй попытке вы преобразовываете каждый байт в шестнадцатеричное представление его числового значения. Байт 0 интерпретируется как целое число 48 (кодовый номер ASCII для символа '0'), который равен 30 в шестнадцатеричном формате. '6' - 54, или 36 в гексагоне и т. Д.

+0

Это работает, но я не вижу, как 'b'067b'' является ASCII. Разве это не два байта, «06» и «7b»? Это действительно дало бы мне \ x06 {', если бы оно было принято как значения ASCII. Что здесь происходит? – MightyPork

+0

@MightyPork: нет, это ** четыре ** байта. Символы '0',' 6', '7' и' b'. Литеральная буква 'b '...'' не принимает шестнадцатеричные символы, она принимает символы ASCII. –

+0

О, хорошо, сбивает с толку. – MightyPork

6

bytes Представление может ввести в заблуждение. b'0607' - это не то же самое, что и bytes([0x06,0x07]). b'0607' на самом деле 4 байта [48,54,48,55] где 48 - код ascii для 0 и т. Д.

[x for x in b'0607'] 
[48, 54, 48, 55] 

как таковой b'0607' уже является строкой ASCII, но представлен в виде bytes, если вы хотите, чтобы преобразовать его в str вам нужно b'0607'.decode("ascii") (так что вы строите ул из этих байтов интерпретируют их как ASCII код (как они находятся)).

В общем, конвертировать bytes в шестнадцатеричную строку, как это:

>>> a = binascii.hexlify(bytes([1,10,15,16,255])) 
>>> a 
b'010a0f10ff' 
>>> type(a) 
<class 'bytes'> 
>>> b = a.decode("ascii") 
>>> type(b) 
<class 'str'>