2013-02-19 43 views
7

Tôi có một chuỗi dài các giá trị thập lục phân rằng tất cả trông tương tự như sau:Làm cách nào để chuyển đổi chuỗi giá trị thập lục phân thành danh sách số nguyên?

'\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00' 

Chuỗi thực tế là 1024 khung hình của một dạng sóng. Tôi muốn chuyển đổi các giá trị thập lục phân này thành danh sách các giá trị số nguyên, chẳng hạn như:

[0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0] 

Làm cách nào để chuyển đổi các giá trị hex này sang int?

+0

Bạn có chuỗi byte, trăn, khi in, chuyển đổi thành biểu diễn dạng chuỗi cho bạn. Các lối thoát '\ x00' được sử dụng cho bất kỳ byte nào không phải là ký tự ASCII có thể in được. –

Trả lời

5

Bạn có thể sử dụng ord() kết hợp với map():

>>> s = '\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00' 
>>> map(ord, s) 
[0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0] 
+0

Không phải là cách tốt nhất để làm điều đó, không phải với 'struct.unpack()' có sẵn và có khả năng diễn giải byte như các loại khác. –

+0

@MartijnPieters - Nhưng một cách thông minh để làm điều đó cho vấn đề rất hạn chế này ... Nó làm tôi mỉm cười. – mgilson

+0

Giải pháp này chậm hơn 6 lần so với 'struct.unpack', btw ..' struct' mất 0,3 giây cho một triệu lần lặp, trong khi 'map (ord, s)' cần 1,8 giây. –

6

sử dụng struct.unpack:

>>> import struct 
>>> s = '\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00' 
>>> struct.unpack('11B',s) 
(0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0) 

này mang đến cho bạn một tuple thay vì một list, nhưng tôi tin tưởng bạn có thể chuyển đổi nó nếu bạn cần.

1
In [11]: a 
Out[11]: '\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00' 

In [12]: import array 

In [13]: array.array('B', a) 
Out[13]: array('B', [0, 0, 0, 1, 0, 0, 0, 255, 255, 0, 0]) 

Một số timings;

$ python -m timeit -s 'text = "\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00";' ' map(ord, text)' 
1000000 loops, best of 3: 0.775 usec per loop 

$ python -m timeit -s 'import array;text = "\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00"' 'array.array("B", text)' 
1000000 loops, best of 3: 0.29 usec per loop 

$ python -m timeit -s 'import struct; text = "\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00"' 'struct.unpack("11B",text)' 
10000000 loops, best of 3: 0.165 usec per loop 
+0

Không tệ; 0,665 giây cho một triệu lần lặp. 'struct' vẫn còn nhanh hơn, nhưng bạn có thể thao tác một' mảng' và lấy một biểu diễn byte trở lại với ít bước hơn. –

+0

cách ngớ ngẩn! Chỉ cần nhận thấy, cập nhật! –

+1

Thời gian có chuỗi 1024 byte: http://pastie.org/6226168; mảng thắng rồi. –

Các vấn đề liên quan