Разбор двоичных данных в объект структуры ctypes через readinto ()

Я пытаюсь обработать двоичный формат, следуя примеру здесь:

http://dabeaz.blogspot.jp/2009/08/python-binary-io-handling.htmlI»

>>> from ctypes import *
>>> class Point(Structure):
>>>     _fields_ = [ ('x',c_double), ('y',c_double), ('z',c_double) ]
>>>
>>> g = open("foo","rb") # point structure data
>>> q = Point()
>>> g.readinto(q)
24
>>> q.x
2.0

мы определили структуру моего заголовка и яя пытаюсь прочитать данные в мою структуру, но яУ меня возникли некоторые трудности. Моя структура такая:

class BinaryHeader(BigEndianStructure):
    _fields_ = [
                ("sequence_number_4bytes", c_uint),
                ("ascii_text_32bytes", c_char),
                ("timestamp_4bytes", c_uint),
                ("more_funky_numbers_7bytes", c_uint, 56),
                ("some_flags_1byte", c_byte),
                ("other_flags_1byte", c_byte),
                ("payload_length_2bytes", c_ushort),

                ] 

документация ctypes говорит:

Для полей целочисленного типа, таких как c_int, может быть задан третий необязательный элемент. Это должно быть небольшое положительное целое число, определяющее ширину поля в битах.

Так что я("more_funky_numbers_7bytes", c_uint, 56),мы пытались определить поле как 7-байтовое поле, но ям получаю ошибку:

ValueError: недопустимое количество битов для битового поля

Итак, моя первая проблема: как я могу определить 7-байтовое поле int?

Тогда, если я пропущу эту проблему и закомментируюmore_funky_numbers_7bytes» поле, результирующие данные получают 's загружено в .. но, как и ожидалось, только 1 символ загружен в "ascii_text_32bytes», И по какой-то причине возвращается16 что я предполагаю, это вычисленное количество байтов, которые он прочитал в структуре ... но если якомментирую мой "прикольный номер " поле и ""ascii_text_32bytes» дает только один символ (1 байт), не долженэто будет 13, а не 16 ???

Затем я попытался разбить поле char на отдельную структуру и сослаться на нее внутри структуры Header. Но это'тоже не работает ...

class StupidStaticCharField(BigEndianStructure):
    _fields_ = [
                ("ascii_text_1", c_byte),
                ("ascii_text_2", c_byte),
                ("ascii_text_3", c_byte),
                ("ascii_text_4", c_byte),
                ("ascii_text_5", c_byte),
                ("ascii_text_6", c_byte),
                ("ascii_text_7", c_byte),
                ("ascii_text_8", c_byte),
                ("ascii_text_9", c_byte),
                ("ascii_text_10", c_byte),
                ("ascii_text_11", c_byte),
                .
                .
                .
                ]

class BinaryHeader(BigEndianStructure):
    _fields_ = [
                ("sequence_number_4bytes", c_uint),
                ("ascii_text_32bytes", StupidStaticCharField),
                ("timestamp_4bytes", c_uint),
                #("more_funky_numbers_7bytes", c_uint, 56),
                ("some_flags_1byte", c_ushort),
                ("other_flags_1byte", c_ushort),
                ("payload_length_2bytes", c_ushort),

                ] 

Итак, есть идеи как:

Определите 7-байтовое поле (которое янужно будет декодировать с помощью определенной функции)Определить поле статического символа 32 байта

UPDATEI»

мы нашли структуру, которая, кажется, работает ...

class BinaryHeader(BigEndianStructure):
    _fields_ = [
                ("sequence_number_4bytes", c_uint),
                ("ascii_text_32bytes", c_char * 32),
                ("timestamp_4bytes", c_uint),
                ("more_funky_numbers_7bytes", c_byte * 7),
                ("some_flags_1byte", c_byte),
                ("other_flags_1byte", c_byte),
                ("payload_length_2bytes", c_ushort),

                ]  

Теперь, однако, мой оставшийся вопрос, почему при использовании:.readinto()

f = open(binaryfile, "rb")

mystruct = BinaryHeader()
f.readinto(mystruct)

Это'с возвращением52 и не ожидаемый,51, Откуда этот дополнительный байт и куда он идет?

ОБНОВЛЕНИЕ 2 Для тех, кто заинтересован здесьспример альтернативыstruct метод чтения значений в именованный кортеж, упомянутый eryksun:

>>> record = 'raymond   \x32\x12\x08\x01\x08'
>>> name, serialnum, school, gradelevel = unpack('

Ответы на вопрос(1)

Ваш ответ на вопрос