我使用ctypes位字段來解剖緊密壓縮的二進制數據。我將一條記錄的數據作爲一個字符串填充到一個聯合中,然後將整個關鍵字段提取出來。Python ctypes - 當字符串嵌入null時設置c_char數組?
如果緩衝區中沒有空值,但任何嵌入的空值都會導致cytpes截斷字符串,則此功能非常有用。
實施例:
from ctypes import *
class H(BigEndianStructure):
_fields_ = [ ('f1', c_int, 8),
('f2', c_int, 8),
('f3', c_int, 8),
('f4', c_int, 2)
# ...
]
class U(Union):
_fields_ = [ ('fld', H),
('buf', c_char * 6)
]
# With no nulls, works as expected...
u1 = U()
u1.buf='abcabc'
print '{} {} {} (expect: 97 98 99)'.format(u1.fld.f1, u1.fld.f2, u1.fld.f3)
# Embedded null breaks it... This prints '97 0 0', NOT '97 0 99'
u2 = U()
u2.buf='a\x00cabc'
print '{} {} {} (expect: 97 0 99)'.format(u2.fld.f1, u2.fld.f2, u2.fld.f3)
瀏覽ctypes的源,我看到兩種方法設置一個字符數組,CharArray_set_value()和CharArray_set_raw()。看起來CharArray_set_raw()將正確處理空值,而CharArray_set_value()則不會。
但我無法弄清楚如何調用原始版本......它看起來像一個屬性,所以我希望是這樣的:
ui.buf.raw = 'abcabc'
但收益率:
AttributeError: 'str' object has no attribute raw
任何指導讚賞。 (包括完全不同的方法!)
(注意:我需要每秒處理數千條記錄,所以效率非常關鍵,使用數組理解在結構體中填充字節數組,但速度要慢100倍。
謝謝,馬克。這有效,但與將字符串中的字節整理到字節數組相關聯的CPU開銷使得我的應用程序的方法過於緩慢。 (我的試用比ctype的memcpy()慢100倍)。 – Simian 2014-10-13 17:20:15