Turbo Pascal中数组的内存布局

时间:2012-11-02 15:47:55

标签: freepascal delphi turbo-pascal

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

旧应用程序通过转储各种内存数据结构来生成文件。在一个地方,应用程序只转储一系列内存,而这个内存范围包含一些数组。我试图找出实际数组元素之前的字节的目的。特别是,块中的前两项可以表示为:

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没有它们。

提前感谢任何尘封的回忆。

3 个答案:

答案 0 :(得分:9)

Pascal数组没有簿记数据。您有一个五字节数据结构数组(string[4]),因此其中65个数组占65 * 5 = 325个字节。如果程序写的不止于此,那就是因为该程序采取了特殊措施来编写更多内容。 “额外”值不只是在内存中,当程序发生写入磁盘时,它用SizeOf天真地编写了整个数据结构。因此,知道这些字节意味着什么的唯一方法是找到源代码或文档。仅仅知道它是Turbo Pascal没有帮助。

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

答案 1 :(得分:2)

除了文件中各个字符串的布局外,您还需要考虑这些单字节字符来自哪个代码页。 C#字符是unicode 2字节字符。

如果幸运的话,原始文件数据仅包含ASCII 7位字符,其中包含英文字母的字符。如果原始数据包含“欧洲”字母,如变音符号或重音字符,则这些字母将为“高ascii”字符值,范围为128..255。您需要执行编码转换才能在C#中正确查看这些字符。 Code page 1252 Windows Latin 1将是一个很好的起点。

如果原始文件数据包含日语,中文,韩语,泰语或其他“东方”脚本中的字符,那么您需要做很多工作。

答案 2 :(得分:1)

Turbo Pascal字符串以长度字节为前缀。所以字符串[2]实际上是3个字节:length,char1和char2。字符串[2]的数组将在内存中将所有字符串一个接一个地直接保存。如果你使用数组作为参数进行块写操作,它将立即以第一个字符串开头,它不会写任何标题等。所以如果你有源代码,你应该能够看到它在数组之前写的内容。