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)尝试将不同类型的阵列编写到文件中,也没有授权安装诸如免费pascal之类的东西,因此我沿着这些行进行实验的机会非常有限。p>这些阵列不是动态的,因为Turbo Pascal没有它们。

事先感谢您的任何尘土飞扬的回忆。

pascal阵列没有簿记数据。您有一个五字节数据结构(string[4])的数组,因此其中65个数组占据65*5 = 325字节。如果该程序撰写的不仅仅是该程序,那是因为该程序采取了特殊措施来写更多。"额外的"值不仅坐在记忆中,当程序用SizeOf编写整个数据结构时,该程序。因此,知道这些字节的唯一方法是找到源代码或文档。只是知道它是涡轮增压的没有帮助。

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

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

如果幸运的话,原始文件数据仅包含ASCII 7位字符,其中涵盖了英语字母的字符。如果原始数据包含"欧洲"字母,例如umlauts或重音字符,则这些数据将是128..255范围内的"高ASCII"字符值。您需要执行编码转换才能在C#中正确查看这些字符。代码页1252 Windows Latin 1将是一个很好的起点。

如果原始文件数据包含日语,中文,韩语,泰语或其他"东方"脚本中的字符,则您的前面有很多工作。

涡轮pascal字符串以长度字节前缀。因此,字符串[2]实际上是3个字节:长度,char1和char2。字符串[2]的阵列将在内存中直接彼此彼此保持一台字符串。如果您将数组作为参数进行块刻度,它将立即从第一个字符串开始,它将不会写入任何标题等。>

最新更新