1

私はファイル形式の変換を少し行っており、元の形式をデコードするために手に入れることができたいくつかの Delphi コードを調べています。

これはバイナリ ファイルであり、このファイルから情報を読み書きする機能を持っているので、ほとんどのことは明らかです。しかし、私は何かに困惑しています。

ファイル内には、一連のビットを Array[i] に読み込む行があります。

S.ReadBuffer(Array[i], sizeOf(Array[i]));

今、私はこのスレッドを見ましたが、同じことが Delphi を介して記述されたフォーマットに適用されるかどうかはわかりません (私はそう思いますが?)。Array[i] の実際の sizeof を知るにはどうすればよいですか? 配列内の変数をカウントするだけで 168 ビットになりますが、それらを適切にパディングするにはどうすればよいでしょうか? ストリーム宣言からこの情報を取得する方法はありますか?

そして、このフォーマット全体に関する別の質問は、構造体 (Array[i] に対応する構造体) の部分が宣言された順序で書き込まれるかどうかということだと思います。構造体内の構造体の場合はどうなりますか?

問題がある場合は、Matlab スクリプトを使用してデコードしています (今のところ)。

編集:構造宣言は次のとおりです。

UsegDef = Record
    tinc: extended;
    cinc: extended;
    tA: LongInt;
    tB: LongInt;
    tC: LongInt;
    Arr: Array of seg;
end;

seg = Record
    val: smallint;
    time: longword;
    typ: byte;
end;
4

2 に答える 2

1

配列要素の宣言型を表示すると役立ちますが、明らかでない場合Array[i]は、i 番目の配列要素を意味するためsizeof(Array[i])、配列内の 1 つの要素のサイズになります。

配列要素がレコード (構造体) 型の場合、デフォルトでは、型に関連する自然な境界で始まるようにフィールドをパディングします。16 ビットの int は、2 で割り切れるオフセット (16 ビット) で始まります。 、 等々。

修飾子がレコード宣言で使用されている場合packed(まれ)、そのようなパディングは実行されません。

フィールドは、宣言された順序で各レコード内に格納されます。

于 2013-06-17T06:11:06.897 に答える
0

ハット ラインにブレークポイントを配置し、sizeof(array[i])ウォッチを追加して実際のサイズを確認できます。

ソースコードを介して手動でカウントするよりも、おそらく高速でエラーが発生しにくいでしょう。

表示されるサイズは、バイトがどのように配置されているかによって異なります。レコードをファイルに書き込むときは、通常packed、型定義に明示的に追加して、値がバイトごとに整列されるようにします。そうしないと、実際に何が書き込まれるかについてすべての賭けが外れます。

于 2013-06-17T06:12:12.570 に答える