Je travaille avec une structure ctypes fournie en externe qui a des champs définis comme des champs fourre-tout à usage général. Le type du champ data
est basé sur la valeur du champ mode
, comme on le voit dans cet exemple:Propre moyen d'insérer la représentation en octets d'un flottant IEEE dans un champ Python ctypes uint32?
CONTAINS_ONE_FLOAT = 1
class TestStruct(ctypes.Structure):
pass
TestStruct._fields_ = [
('mode', ctypes.c_uint32),
('data', ctypes.c_uint32 * 2)
]
je dois stocker une simple précision (32 bits) Valeur de virgule flottante data
chaque fois que mode
est défini sur CONTAINS_ONE_FLOAT
. Le deuxième mot de data
n'est pas utilisé dans ce mode.
Je n'ai jusqu'ici été capable de comprendre cette approche en utilisant des ctypes de coulée. Il semble WAY trop verbeux, mais cela fonctionne.
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]))
Existe-t-il une meilleure façon de faire cela qui ne nécessite pas 5 étapes?
Sur une ligne, vous pouvez utiliser 'ctypes.c_float.from_buffer (x.data) .value = 42.42'. – eryksun