6

CArchiveで記述されたファイルをC#で読み込もうとしています。私がフォーマットを知ることができることから:

[次のデータセットの長さ][データ]...など

ただし、一部のデータについてはまだあいまいです。日付データを読み込むにはどうすればよいですか?float、int、doubleなどはどうですか?

また、[次のデータセットの長さ]は、バイト、ワード、またはdwordの場合があります。それぞれがいつになるかをどうやって知ることができますか?たとえば、文字列「1.10」の場合、データは次のようになります。

04 31 2e 31 30

これ04は明らかに長さであり、残りは1.10の16進値です。些細なことです。後で、41文字の長さの文字列がありますが、[length]の値は次のとおりです。

00 00 00 29

なぜ長さが4バイトなのですか?(0x29 = 41)

主な質問は次のとおりです。CArchive出力の形式の仕様はありますか?

4

2 に答える 2

8

文字列に関する質問に答えるために、アーカイブに保存される長さの値は、文字列の長さとエンコーディングに応じて、それ自体が可変長になります。文字列が< 255文字の場合、長さには1バイトが使用されます。文字列が255 - 65534文字の場合、3バイトが使用されます-1バイトの0xFFマーカーの後に2バイトのワードが続きます。文字列が65535+文字の場合、7バイトが使用されます-3バイトの0xFF 0xFF 0xFFマーカーの後に4バイトのdwordが続きます。さらに複雑にするために、文字列がUnicodeでエンコードされている場合、長さの値の前に3バイトの0xFF 0xFFFEマーカーが付きます。したがって、どの組み合わせでも、4バイトの長さだけが表示されることはありません。したがって、表示する内容は、0x00他のものに属する3バイトであり、その後に1バイトの文字列の長さが続く必要があります0x29

したがって、文字列を読み取る正しい方法は次のとおりです。

仮定:特に明記されていない限り、文字列データはAnsiです。

  1. バイトを読み取ります。その値が<255の場合、文字列の長さが値になり、3に進みます。

  2. 単語を読んでください。その値が0xFFFE、の場合、文字列データはUnicode、goto 1です。それ以外の場合、その値が<65535の場合、文字列の長さはその値、goto 3です。それ以外の場合、dwordを読み取り、文字列の長さはその値、goto3です。

  3. 文字列がAnsiまたはUnicodeのどちらであるかに応じて、8ビットまたは16ビット値の文字列の長さの数値を読み取り、必要に応じて目的のエンコーディングに変換します。

于 2012-01-19T21:44:22.037 に答える
3

ドキュメントによると:

主なCArchiveの実装は、ARCCORE.CPPにあります。

MFCソースがない場合は、こちらをご覧ください

于 2012-01-19T19:42:51.503 に答える