结构数组问题 - 如何手动确定sizeof() - Delphi?

时间:2013-06-17 03:21:56

标签: delphi file-io structure

我正在进行一些文件格式转换,并查看一些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;

2 个答案:

答案 0 :(得分:1)

如果你显示数组元素的声明类型会有所帮助,但是如果它不明显Array[i]表示第i个数组元素,因此sizeof(Array[i])是一个元素的大小在数组中。

如果数组元素是一个记录(结构)类型,那么默认是填充字段,使它们在与其类型相关的自然边界上开始 - 一个16位的int从一个可被2整除的偏移量开始(16 -bits),等等。

如果在记录声明中使用packed修饰符(罕见),则不执行此类填充。

字段按照声明的顺序存储在每个记录中。

答案 1 :(得分:0)

您可以在帽线上放置断点,并添加sizeof(array[i])手表以查看实际尺寸。

与通过源代码手动计数相比,这可能更快,更不容易出错。

您看到的大小取决于字节的对齐方式。当我将记录写入文件时,我通常会明确地将packed添加到类型定义中,以确保每个字节的值都是对齐的,否则所有的赌注都与实际写入的内容有关。