2013-10-08 2 views
3

У меня есть список, который представляет собой смесь символов и байтов, который выглядит следующим образом:Как преобразовать список символов и байтов в список чистых байтов?

myData = ['a', '\x65', 'B', '\x66\x69', 'C'] 

Я хочу, чтобы преобразовать этот список в массив байтов, так что:

myByteArray = ['\x61' , '\x65', '\x42', '\x66', '\x69', '\x43'] 

Я пытались до сих пор является простым дисплеем на MyData -

myData = ['a', '\x65', 'B', '\x66\x69', 'C'] 
print " ".join(hex(ord(n)) for n in myData) 

Поскольку элемент в массиве, который случается два байта, он выдает эту ошибку:

Traceback (most recent call last): 
    File "./test.py", line 3, in <module> 
    print " ".join(hex(ord(n)) for n in myData) 
    File "./test.py", line 3, in <genexpr> 
    print " ".join(hex(ord(n)) for n in myData) 
TypeError: ord() expected a character, but string of length 2 found 

Как преобразовать исходный список myData в массив байтов myByteArray?

+0

Там нет никакого способа, чтобы получить Python изобразить регулярный ASCII символ как беглая последовательность, если не превратить его в эквивалентную строку. '' a'' и '' \ x61'' являются тем же символом, и Python всегда будет печатать его как 'a''. –

ответ

1

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

output_list = [hex(ord(c)) for c in ''.join(myData)] 

Попытка его,

>>> myData = ['a', '\x65', 'B', '\x66\x69', 'C'] 
>>> [hex(ord(c)) for c in ''.join(myData)] 
['0x61', '0x65', '0x42', '0x66', '0x69', '0x43'] 
+0

Я подозреваю, что это не удастся, если вы передадите его байтом вне диапазона ASCII. –

+0

Это работает для значения байта вне диапазона ASCII. – user791953

+0

@MarkRansom Я попытался использовать некоторые символы, отличные от ASCII, и, похоже, работает –

1

Если вы на самом деле хотите list изменяемых байт, а не один из неизменяемых односимвольных строк, вы можете сделать это следующим образом:

myData = ['a', '\x65', 'B', '\x66\x69', 'C', '\xff'] 

myByteArray = bytearray(''.join(myData)) 

print " ".join(hex(byte) for byte in myByteArray) 
# 0x61 0x65 0x42 0x66 0x69 0x43 0xff 

I е а list одного-символ строка в порядке, все, что вам нужно:

myByteArray = list(''.join(myData)) 
Смежные вопросы