我对python很新。我想要做的是从二进制文件中读取一些类似c的结构。创建它们的c程序中的结构定义为:
struct B{
uint16 y;
uint8 c[SIZE2];
}
struct A{
uint32 x;
struct B b[SIZE1];
}
我希望能够使用NumPy包函数fromFile
读取所有A结构,但我不知道如何调用正确的dtype
方法,如:
record = numpy.dtype([
("field1", numpy.uint8),
("field2", numpy.uint16),
("field3", numpy.uint32)
])
具有如此复杂的数据结构。
你可以帮我写一下吗?提前谢谢!答案 0 :(得分:1)
这是一个猜测,因为我没有太多使用C结构。
In [125]: SIZE1, SIZE2 = 3,4
In [127]: dtB=np.dtype([('y',np.uint16),('c',np.uint8,(SIZE2,))])
In [128]: np.ones((2,), dtype=dtB)
Out[128]:
array([(1, [1, 1, 1, 1]), (1, [1, 1, 1, 1])],
dtype=[('y', '<u2'), ('c', 'u1', (4,))])
In [129]: _.itemsize
Out[129]: 6
在此定义中,此数组的每条记录由6个字节组成,2个用于y
字段,4个用于c
字段。
然后将其嵌套在A
定义
In [130]: dtA=np.dtype([('x',np.uint32),('b',dtB,(SIZE1,))])
In [131]: np.ones((2,), dtype=dtA)
Out[131]:
array([(1, [(1, [1, 1, 1, 1]), (1, [1, 1, 1, 1]), (1, [1, 1, 1, 1])]),
(1, [(1, [1, 1, 1, 1]), (1, [1, 1, 1, 1]), (1, [1, 1, 1, 1])])],
dtype=[('x', '<u4'), ('b', [('y', '<u2'), ('c', 'u1', (4,))], (3,))])
In [132]: _.itemsize
Out[132]: 22
每个记录有4个字节用于x
字段,3 * 6用于3个b
元素。
In [133]: __.tobytes()
Out[133]: b'\x01\x00\x00\x00\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x00\x00\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01\x01\x00\x01\x01\x01\x01'
试图使阵列更有趣:
In [136]: A['x']=[1,2]
In [139]: A['b']['y'] *= 3
In [141]: A['b']['c'][0]=2
In [142]: A['b']['c'][1]=3
In [143]: A
Out[143]:
array([(1, [(3, [2, 2, 2, 2]), (3, [2, 2, 2, 2]), (3, [2, 2, 2, 2])]),
(2, [(3, [3, 3, 3, 3]), (3, [3, 3, 3, 3]), (3, [3, 3, 3, 3])])],
dtype=[('x', '<u4'), ('b', [('y', '<u2'), ('c', 'u1', (4,))], (3,))])
In [144]: A[0].tobytes()
Out[144]: b'\x01\x00\x00\x00\x03\x00\x02\x02\x02\x02\x03\x00\x02\x02\x02\x02\x03\x00\x02\x02\x02\x02'
这些字节串是否与您的c
结构一致?