1

我正在做一些文件格式转换,并查看一些我能够着手解码原始格式的 Delphi 代码。

这是一个二进制文件,我有如何从这个文件中写入和读取信息的功能,所以大部分事情都很清楚。然而,我被一些事情难住了。

在文件中有一行,我们将一堆位读入 Array[i]:

S.ReadBuffer(Array[i], sizeOf(Array[i]));

现在,我看到了这个线程,但我不确定这同样适用于通过 Delphi 编写的格式(尽管我会假设如此?)。我怎么知道 Array[i] 的实际大小?只需计算数组中的变量,我就得到 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;
4

2 回答 2

1

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

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

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

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

于 2013-06-17T06:11:06.897 回答
0

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

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

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

于 2013-06-17T06:12:12.570 回答