freepascal - Turbo Pascal 中数组的内存布局

标签 freepascal delphi turbo-pascal

我们在 Turbo Pascal 中有一个旧应用程序,它可以将其内部状态保存到文件中,并且我们需要能够在 C# 应用程序中读取/写入该文件。

旧应用程序通过转储各种内存中数据结构来生成文件。在一个地方,应用程序只是转储一定范围的内存,并且该内存范围包含一些数组。我试图弄清楚紧邻实际数组元素之前的字节的用途。特别是, block 中的前两项可以表示为:

type
  string2 = string[2];
  stringarr2 = array[0..64] of string2;
  string4 = string[4];
  stringarr4 = array[0..64] of string4;

在数据文件中,我看到以下字节序列:

25 00 02 02 41 42 02 43 44 ...

25 是数组中元素的数量。 02 41 42 是第一个字符串元素“AB”; 02 43 44 是第二个字符串元素“CD”,依此类推。我不知道数组元素计数和第一个数组元素之间的 00 02 指的是什么。数组元素计数可能为 25 00,元素大小为 02,但每个数组元素的大小实际上为 3 个字节。

在文件中 4 字符字符串数组开始的位置,我看到以下内容:

25 00 04 00 00 04 41 42 43 44 04 45 46 47 48

同样,25 是数组中元素的数量; 04 41 42 43 44 是数组中的第一个元素,“ABCD”,依此类推。其间有字节 00 04 00 00。也许它们是旗帜。也许它们是数组形状的某种指示(但我不明白 0204 两者如何指示一维数组)。

我无法访问 Turbo Pascal 来尝试将不同类型的数组写入文件,也无权安装 Free Pascal 之类的东西,因此我进行这些实验的机会非常有限。

这些数组不是动态的,因为 Turbo Pascal 没有它们。

提前感谢所有尘封的记忆。

最佳答案

Pascal 数组没有簿记数据。您有一个 5 字节数据结构数组 (string[4]),因此包含 65 个数据结构的数组占用 65*5=325 字节。如果程序写入的内容多于此,那么这是因为程序采取了特殊措施来写入更多内容。当程序天真地使用 SizeOf 写入整个数据结构时,“额外”值并不仅仅存在于内存中,而程序碰巧会写入磁盘。因此,了解这些字节含义的唯一方法是查找源代码或文档。仅仅知道它是 Turbo Pascal 是没有帮助的。

文件的第一部分可能故意与所有其他数组元素的大小相同。对于两字符的字符串,“ header ”为三个字节,对于四字符的字符串,“ header ”为五个字节,与字符串的大小相同。这将允许程序使用 string4 数据类型的文件,然后跳过文件的第一条记录。文件长度和 header 中的字符串长度之间的零可能属于这些字段中的任何一个,其余两个零字节可能只是填充符。

关于freepascal - Turbo Pascal 中数组的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198650/

相关文章:

delphi - Delphi/Pascal/FreePascal 中的 MD5 用于短字符串

arrays - 如何使动态数组常量?

dos - Turbo Pascal 3.0 中的键盘快捷键?

gdb - 为什么 gdb 认为我的 x86-64 程序是 i386?

delphi - 如何在Delphi FireMonkey XE4中播放系统声音?

free pascal 中的 Python+Numpy 模块

c++ - 如何在剪贴板上放置多种格式?

delphi - 将VCL组件导入Firemonkey应用程序

dynamic-arrays - SetLength 的复杂度是多少?

fortran - 为 FreePascal/Lazarus 包装一个 Fortran 库