3

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

提前感谢任何尘土飞扬的回忆。

4

3 回答 3

9

Pascal 数组没有簿记数据。您有一个 5 字节数据结构数组 ( string[4]),因此包含 65 个数据结构的数组占用 65*5=325 个字节。如果程序写的比这多,那是因为程序采取了特殊的措施,写得更多。当程序天真地用SizeOf. 因此,了解这些字节含义的唯一方法是查找源代码或文档。仅仅知道它是 Turbo Pascal 是没有帮助的。

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

于 2012-11-02T17:08:30.223 回答
2

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

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

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

于 2012-11-02T17:54:04.120 回答
1

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

于 2012-11-02T16:48:39.340 回答