Как создать ctypes.BigEndianStructure, содержащий ctypes.Union? - PullRequest
2 голосов
/ 11 июля 2020

Я пытаюсь перенести код C на Python 3.6, используя библиотеку ctypes, но мне не удалось создать ctypes.BigEndianStructure, содержащий ctypes.Union. Он вызывает TypeError: This type does not support other endian.

Исключение кажется адекватным, поскольку, глядя на документацию ctypes для класса Union, ясно сказано, что это базовый класс для объединений в собственный порядок байтов , а мой собственный порядок байтов является прямым порядком байтов (не то, что требуется в данном случае).

Позвольте мне проиллюстрировать мой код.

code.c:

typedef struct header {
    unsigned int a;
    unsigned int b;
} header;

typedef struct body {
    unsigned int a;
    unsigned int b;
} body;

typedef struct structure {
    union {
        struct header header;
        char _fill[0x10];
    } header;
    union {
        struct body body;
        char _fill[0x10];
    } body;
} structure;

code.py:

import ctypes

class header(ctypes.BigEndianStructure):
    _fields_ = [
        ('a', ctypes.c_uint),
        ('b', ctypes.c_uint)
    ]

class body(ctypes.BigEndianStructure):
    _fields_ = [
        ('a', ctypes.c_uint),
        ('b', ctypes.c_uint)
    ]

class _header(ctypes.Union):
    _fields_ = [ 
        ('header', header),
        ('_fill', ctypes.c_char*0x10),
    ]

class _body(ctypes.Union):
    _fields_ = [ 
        ('body', body),
        ('_fill', ctypes.c_char*0x10),
    ]

#class structure(ctypes.Structure): # <-- works, but it is not what I need.
class structure(ctypes.BigEndianStructure): # <-- raises TypeError.
    _fields_ = [
        ('header', _header),
        ('body', _body),
    ]

Как продолжить создание структуры?

...