gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:39:55 27 4
gpt4 key购买 nike

我们在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com