Piszę dookoła z tworzeniem binarnego parsera danych i gdybym mógł wrócić do C, chciałem sprawdzić, czy mogę użyć Pythona do zadania.Jak prawidłowo opisać strukturę typu + Union w języku Python?
mam pewne pojęcie o tym, jak dostać się dzieje, a moja obecna implementacja wygląda mniej więcej tak:
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))
która produkuje ten wyjściowe:
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
Więc ... wygląda mi podobnie jak moje bajty nie są bajtami tak bardzo jak słowami. Nie wiem wystarczająco dużo o Pythonie lub ctypach, aby zrozumieć, dlaczego tak jest, ale to w pewnym sensie niweczy mój cel. Jakieś pomysły?
prostu próbowałem to na konstrukcji, która wynosi 48 bitów, i to działa dobrze. –