es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ctypes guarda una estructura dentro de otra estructura en un archivo.

Quiero guardar muchas estructuras dentro de otras estructuras en un archivo con ctypes, pero no funciona. Las estructuras dentro de otra estructura no se guardan en el archivo. Solo la estructura “root” queda guardada en el archivo.

import ctypes

class A(ctypes.Structure):
    <em>pack</em> = 1
    <em>fields</em> = [("x", ctypes.c_char * 15)]

A.<em>fields</em>.append(("y", A))

with open("test.struct", "wb+") as f:
    root = A(h := b"Hello")
    root.y = A(b"hi")
    f.write(root.y)
    f.write(root)

with open("test.struct", "rb+") as f:
    b = A()
    f.readinto(b)
    z = b
    o = 0
    print(b.x)
    o += 1
    print(o, z.x)
    z = z.y

¿Cómo puedo guardar estructuras dentro de estructuras en un archivo con ctypes?

Python: 3.10 – Linux

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para guardar estructuras dentro de estructuras en un archivo con ctypes, es necesario escribir recursivamente cada estructura en el archivo. En el código dado, solo se guarda la estructura “root” en el archivo y no su estructura anidada (root.y).

    Aquí tienes un código actualizado que guarda ambas estructuras en un archivo:

    import ctypes
    
    
    class A(ctypes.Structure):
        _pack_ = 1
        _fields_ = [("x", ctypes.c_char * 15)]
    
    A._fields_.append(("y", A))
    
    def save_struct(structure, file):
        file.write(structure)
        # guardar recursivamente las estructuras anidadas
        for field in structure._fields_:
            if issubclass(field[1], ctypes.Structure):
                nested_structure = getattr(structure, field[0])
                save_struct(nested_structure, file)
    
    with open("test.struct", "wb+") as f:
        root = A(b"Hello")
        root.y = A(b"hi")
        save_struct(root, f)
    
    with open("test.struct", "rb+") as f:
        b = A()
        f.readinto(b)
        z = b
        o = 0
        print(b.x)
        o += 1
        print(o, z.x)
        z = z.y
        print(z.x)
    

    La función save_struct escribe recursivamente cada campo de la estructura en el archivo, y para cualquier estructura anidada, llama nuevamente a la función para escribir la estructura anidada en el archivo también.

    Este código actualizado debería guardar ambas estructuras en el archivo y ser capaz de leerlas correctamente.

Comments are closed.