3

Turbo Pascalには、内部状態をファイルに保存できる古いアプリケーションがあり、C#アプリケーションでこのファイルの読み取り/書き込みができる必要があります。

古いアプリケーションは、さまざまなメモリ内データ構造をダンプすることによってファイルを生成します。ある場所では、アプリケーションはメモリの範囲をダンプするだけであり、このメモリ範囲にはいくつかの配列が含まれています。実際の配列要素の直前のバイトの目的を削除しようとしています。特に、ブロックの最初の2つの項目は次のように表すことができます。

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は2番目の文字列要素「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両方とも1次元配列を示しています)。

さまざまな種類の配列をファイルに書き込もうとするTurboPascalにアクセスできず、Free Pascalのようなものをインストールする権限もありません。そのため、これらの行に沿って実験する機会は非常に限られています。

Turbo Pascalにはアレイがなかったため、これらのアレイは動的ではありません。

ほこりっぽい思い出をよろしくお願いします。

4

3 に答える 3

9

Pascalアレイには簿記データがありません。5バイトのデータ構造の配列(string[4])があるため、そのうちの65の配列は65 * 5=325バイトを占有します。プログラムがそれ以上の書き込みをした場合、それはプログラムがさらに書き込みを行うために特別な措置を講じたためです。「余分な」値は、プログラムがデータ構造全体を.で単純に書き込んだときに、プログラムがたまたまディスクに書き込んだメモリにあるだけではありませんでしたSizeOf。したがって、これらのバイトの意味を知る唯一の方法は、ソースコードまたはドキュメントを見つけることです。TurboPascalであることを知っているだけでは役に立ちません。

ファイルの最初のセクションが、他のすべての配列要素と意図的に同じサイズである可能性があります。2文字の文字列の場合、「ヘッダー」は3バイトであり、4文字の文字列の場合、「ヘッダー」は文字列のサイズと同じ5バイトです。これにより、プログラムはファイルのfile of string4データ型を使用し、ファイルの最初のレコードをスキップすることができます。ファイルの長さとヘッダーの文字列の長さの間のゼロは、これらのフィールドのいずれかに属している可能性があり、残りの2つのゼロバイトは単なるフィラーである可能性があります。

于 2012-11-02T17:08:30.223 に答える
2

ファイル内の文字の個々の文字列のレイアウトに加えて、それらのシングルバイト文字がどのコードページからのものであるかも考慮する必要があります。C#文字はUnicodeの2バイト文字です。

運が良ければ、元のファイルデータには、英語のアルファベットの文字をカバーするASCII7ビット文字のみが含まれています。元のデータにウムラウトやアクセント付き文字などの「ヨーロッパ」の文字が含まれている場合、これらは128〜255の範囲の「highascii」文字値になります。これらの文字をC#で正しく表示するには、エンコード変換を実行する必要があります。コードページ1252WindowsLatin1が出発点として適しています。

元のファイルデータに日本語、中国語、韓国語、タイ語、または他の「東部」スクリプトの文字が含まれている場合は、多くの作業が必要になります。

于 2012-11-02T17:54:04.120 に答える
1

Turbo Pascal文字列には、長さバイトのプレフィックスが付いています。したがって、string [2]は実際には3バイトです:length、char1、char2。string [2]の配列は、すべての文字列を1つずつメモリ内に直接保持します。配列をパラメーターとしてブロック書き込みを行うと、最初の文字列からすぐに開始され、ヘッダーなどは書き込まれません。したがって、ソースがある場合は、配列の前に何が書き込まれるかを確認できるはずです。

于 2012-11-02T16:48:39.340 に答える