2013-03-17 26 views
5

giải nén từ chuỗi hoạt động:`struct.unpack_from` không hoạt động với` bytearray`?

>>> import struct 
>>> struct.unpack('>h', 'ab') 
(24930,) 
>>> struct.unpack_from('>h', 'zabx', 1) 
(24930,) 

nhưng nếu nó một bytearray:

>>> struct.unpack_from('>h', bytearray('zabx'), 1) 
Traceback (most recent call last): 
    File "<ipython-input-4-d58338aafb82>", line 1, in <module> 
    struct.unpack_from('>h', bytearray('zabx'), 1) 
TypeError: unpack_from() argument 1 must be string or read-only buffer, not bytearray 

Mà dường như một chút lẻ. Tôi thực sự phải làm gì với nó? rõ ràng là tôi có thể:

>>> struct.unpack_from('>h', str(bytearray('zabx')), 1) 
(24930,) 

Nhưng tôi dứt khoát cố gắng tránh sao chép một lượng lớn có thể là bộ nhớ xung quanh.

+0

Bạn có thể sử dụng loại bộ đệm để tham chiếu đến chuỗi mà không chiếm nhiều bộ nhớ hơn, sau đó truyền tham số đó làm đối số. –

Trả lời

6

Dường như buffer() sự là giải pháp:

>>> struct.unpack_from('>h', buffer(bytearray('zabx')), 1) 
(24930,) 

buffer() không phải là một bản sao của bản gốc, một cái nhìn của nó:

>>> b0 = bytearray('xaby') 
>>> b1 = buffer(b0) 
>>> b1 
<read-only buffer for ...> 
>>> b1[1:3] 
'ab' 
>>> b0[1:3] = 'nu' 
>>> b1[1:3] 
'nu' 

Alternitively, Bạn (? I) có thể chỉ cần sử dụng python 3; giới hạn được nâng lên:

Python 3.2.3 (default, Jun 8 2012, 05:36:09) 
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import struct 
>>> struct.unpack_from('>h', b'xaby', 1) 
(24930,) 
>>> struct.unpack_from('>h', bytearray(b'xaby'), 1) 
(24930,) 
>>> 
+0

Tại sao không chỉ sử dụng 'bộ đệm ('xaby', chỉ mục, độ dài)'? Điều đó không sử dụng hết bộ nhớ bổ sung. –

+2

nó xảy ra rằng bit 'struct' được bao quanh một' bytearray', được chọn * vì * nó có thể thay đổi. Mỗi lần thay vì duy trì chế độ xem chỉ đọc của dữ liệu chính, có thể thay đổi, tôi chỉ muốn tạo lại các bit ở giữa để lấy dữ liệu từ nguồn chính của nó. Điều này cũng đi cho chỉ giữ '(24930,)'. Tôi thực sự muốn giải nén từ một 'bytearray'. – SingleNegationElimination

+0

@Asad: Tôi nghi ngờ việc tạo một đối tượng 'buffer' tiêu thụ ít nhất một bộ nhớ nhỏ. – martineau

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