我正在进行一些文件格式转换,并查看一些Delphi代码,我能够开始解码原始格式。
这是一个二进制文件,我有如何从这个文件写入和读取信息的功能,所以大部分事情都很清楚。然而,我对某些事情感到困惑。
在文件中有一行我们将一堆位读入Array [i]:
S.ReadBuffer(Array[i], sizeOf(Array[i]));
现在,我看到了this thread,但我不确定这同样适用于通过Delphi编写的格式(虽然我会这么认为?)。我怎么能告诉Array [i]的实际sizeof?只是通过计算数组中的变量,我得到168位,但我如何正确填充它们?有没有办法从流声明中获取此信息?
我想另外一个关于这整个格式的问题是 - 结构的部分(与Array [i]相对应的结构)是按照声明的顺序写的吗?如果它是结构中的结构怎么办?
如果重要,我正在使用Matlab脚本对其进行解码(暂时)。
编辑:这是结构声明:
UsegDef = Record
tinc: extended;
cinc: extended;
tA: LongInt;
tB: LongInt;
tC: LongInt;
Arr: Array of seg;
end;
seg = Record
val: smallint;
time: longword;
typ: byte;
end;
答案 0 :(得分:1)
如果你显示数组元素的声明类型会有所帮助,但是如果它不明显Array[i]
表示第i个数组元素,因此sizeof(Array[i])
是一个元素的大小在数组中。
如果数组元素是一个记录(结构)类型,那么默认是填充字段,使它们在与其类型相关的自然边界上开始 - 一个16位的int从一个可被2整除的偏移量开始(16 -bits),等等。
如果在记录声明中使用packed
修饰符(罕见),则不执行此类填充。
字段按照声明的顺序存储在每个记录中。
答案 1 :(得分:0)
您可以在帽线上放置断点,并添加sizeof(array[i])
手表以查看实际尺寸。
与通过源代码手动计数相比,这可能更快,更不容易出错。
您看到的大小取决于字节的对齐方式。当我将记录写入文件时,我通常会明确地将packed
添加到类型定义中,以确保每个字节的值都是对齐的,否则所有的赌注都与实际写入的内容有关。