Tôi đang rối tung xung quanh với việc tạo một trình phân tích cú pháp dữ liệu nhị phân và trong khi tôi có thể quay trở lại C, tôi muốn xem liệu tôi có thể sử dụng Python cho tác vụ hay không.Làm cách nào để khai báo chính xác cấu trúc ctype + Liên kết bằng Python?
Tôi có một số ý niệm mơ hồ về cách để có được đi này, và thực hiện hiện tại của tôi trông giống như sau:
from ctypes import *
class sHeader(Structure):
_fields_ = [("CC", c_uint8, 4),
("AFC", c_uint8, 2),
("TSC", c_uint8, 2),
("PID", c_uint16, 13),
("TP", c_uint16, 1),
("PSI", c_uint16, 1),
("TEI", c_uint16, 1),
("SyncByte", c_uint8)]
class Header(Union):
_fields_ = [("sData", sTsHeader),
("ulData", c_uint32)]
head = Header()
head.ulData = 0xffffffff
print(head.ulData)
print(head.sData.SyncByte)
print(sHeader.SyncByte)
print(sHeader.TEI)
print(sHeader.PSI)
print(sHeader.TP)
print(sHeader.PID)
print(sHeader.TSC)
print(sHeader.AFC)
print(sHeader.CC)
print(sizeof(sHeader))
print(sizeof(c_uint8))
print(sizeof(c_uint16))
print(sizeof(c_uint32))
nào sản xuất sản lượng này:
V:\>C:\Python27\python.exe WidiUnpacker.py
0xffffffffL
0x0
<Field type=c_ubyte, ofs=4, size=1>
<Field type=c_ushort, ofs=2:15, bits=1>
<Field type=c_ushort, ofs=2:14, bits=1>
<Field type=c_ushort, ofs=2:13, bits=1>
<Field type=c_ushort, ofs=2:0, bits=13>
<Field type=c_ubyte, ofs=0:6, bits=2>
<Field type=c_ubyte, ofs=0:4, bits=2>
<Field type=c_ubyte, ofs=0:0, bits=4>
6
1
2
4
Vì vậy ... Có vẻ đối với tôi như byte của tôi không phải là byte nhiều như từ. Tôi không biết đủ về Python hoặc ctypes để hiểu tại sao đó là, nhưng đó là loại đánh bại mục đích của tôi vào lúc này. Ý tưởng nào?
Chỉ cần cố gắng này trên một cấu trúc đó là 48 bit, và nó hoạt động độc đáo. –