How to resize variable sized buffer with c types python?

问题描述 投票:0回答:0
import struct
import ctypes as ct

def read_buffer(data):
    size = struct.unpack('<h', data[64:66])[0]
    class TableData(ct.Structure):
        _fields_ = [('delta', ct.c_float),
                    ('x', ct.c_float)]
        def __repr__(self):
            return f'TableData(delta={self.delta}, x={self.x})'

    class TableParameters(ct.Structure):
        _fields_ = [('parameter1', ct.c_uint16 * 30),
                    ('parameter2', ct.c_float),
                    ('size', ct.c_uint16),
                    ('parameter3', ct.c_uint16),
                    ('parameter4', ct.c_float),
                    ('parameter5', ct.c_float),
                    ('Table', TableData * size)]
        def __repr__(self):
            return (f'TableParameters(parameter1={list(self.parameter1)},'
                    f'parameter2={self.parameter2},'
                    f'size={self.size},'
                    f'parameter3={self.parameter3},'
                    f'parameter4={self.parameter4},'
                    f'parameter5={self.parameter5},'
                    f'Table={list(self.Table)}')

    return TableParameters.from_buffer_copy(data)

data = struct.pack('<30HfHHff4f',*range(30),1.125,2,8,2.5,3.25,4.75,5.5,6.25,7.75)
a = read_buffer(data)
print (a.parameter1[0])
print (a.parameter1[3])
print (a.parameter5)
print ('------------')
print (len(a.Table))
a.size = 10
print (len(a.Table))

输出:

0
3
3.25        
------------
2
2

这是一个具有可变大小缓冲区的结构。名为“size”的字段应该确定名为“Table”的字段的大小。读取数据时,它工作正常。但是当试图修改“表格”的大小时,它不起作用或者至少不像人们想象的那么简单。在输出中,我们可以看到“Table”的大小没有改变,无法向其添加数据点。

python python-3.x struct ctypes
© www.soinside.com 2019 - 2024. All rights reserved.