我正在使用外部提供的ctypes结构,它有一些字段定义为通用捕获所有字段。所述data
字段的类型是基于mode
字段的值,如本示例所示:干净的方式将IEEE浮点数的字节表示插入Python ctypes uint32字段?
CONTAINS_ONE_FLOAT = 1
class TestStruct(ctypes.Structure):
pass
TestStruct._fields_ = [
('mode', ctypes.c_uint32),
('data', ctypes.c_uint32 * 2)
]
我需要存储单精度(32位)浮点值在data
每当mode
设置为CONTAINS_ONE_FLOAT
。在此模式下不使用data
的第二个字。
我迄今为止只能使用ctypes casting来找出这种方法。看起来WAY太冗长了,但它起作用。
float_value = 42.42
float_value_c = ctypes.c_float(float_value)
float_value_cp = ctypes.POINTER(ctypes.c_float)(float_value_c)
int_val_p = ctypes.cast(float_value_cp, ctypes.POINTER(ctypes.c_uint32))
int_val = int_val_p.contents
x = TestStruct()
x.mode = CONTAINS_ONE_FLOAT
x.data[0] = int_val
print("Should be 1110027796: " + str(x.data[0]))
有没有更好的方法来做到这一点,不需要5个步骤?
在一行中,您可以使用'ctypes.c_float.from_buffer(x.data).value = 42.42'。 – eryksun