# coding: utf-8
import sys
import ctypes as c
assert sys.byteorder == "little"
"""
struct MyStruct {
unsigned char a;
unsigned char b:
};
struct MainStruct {
union {
struct MyStruct my_struct;
short field_ab;
} my_union;
unsigned char foo;
};
"""
class MyStruct(c.BigEndianStructure):
_fields_ = [("a", c.c_byte), ("b", c.c_byte)]
class MyUnion(c.BigEndianUnion):
_fields_ = [("my_struct", MyStruct), ("ab", c.c_short)]
class MainStruct(c.BigEndianStructure):
_fields_ = [("my_union", MyUnion), ("foo", c.c_byte)]
TypeError Traceback (most recent call last)
Cell In[1], line 28
24 class MyUnion(c.BigEndianUnion):
25 _fields_ = [("my_struct", MyStruct), ("ab", c.c_short)]
---> 28 class MainStruct(c.BigEndianStructure):
29 _fields_ = [("my_union", MyUnion), ("foo", c.c_byte)]
File ~\AppData\Local\Programs\Python\Python311\Lib\ctypes\_endian.py:31, in _swapped_meta.__setattr__(self, attrname, value)
29 typ = desc[1]
30 rest = desc[2:]
---> 31 fields.append((name, _other_endian(typ)) + rest)
32 value = fields
33 super().__setattr__(attrname, value)
File ~\AppData\Local\Programs\Python\Python311\Lib\ctypes\_endian.py:21, in _other_endian(typ)
19 if issubclass(typ, Structure):
20 return typ
---> 21 raise TypeError("This type does not support other endian: %s" % typ)
TypeError: This type does not support other endian: <class '__main__.MyUnion'>
Bug report
The classes ctypes.BigEndianUnion and ctypes.LittleEndianUnion was added in Python 3.11. In the case of the use of an
Unionin aStructureclass that match the opposite system endianness, theUnionclass can't be used as shown below:The following traceback is given by the interpretor:
Your environment
Linked PRs