2

WindowsのHIVEファイルからベースブロックを読み取ろうとしています。ファイルの最初の4バイトには、「regf」マジックナンバーが含まれています。この文字列はANSIですが、Unicode文字列もあります。MarshalAs属性を指定し、タイプをByValTStrに設定すると、正常に機能しますが、Unicode文字列は読み取られません。MSDNによると、ByValTStrを使用する場合、配列のタイプは、含まれている構造体の文字セットによって決定されます。問題は、構造全体で文字セットをユニコードに設定すると、マジックナンバー(最初の4バイト)を読み取ることができないことです。

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string MagicNumber;

構造全体ではなく、特定の文字列の文字セットを変更するにはどうすればよいですか?

LPStrタイプも使おうとしていますが、まったく動作しません。

[MarshalAs(UnmanagedType.LPStr, SizeConst = 5)]
public String MagicNumber;

「regf」マジックナンバーの代わりにこのタイプのマーシャラインを使用すると、判読できない文字が表示されます。

それを修正する方法は?

前もって感謝します。

4

1 に答える 1

2

代わりにそれをマーシャリングしByValArrayます:

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public byte[] MagicNumber;

文字列としては必要ありません。文字列に設定すると、マーシャラーはおそらく失敗します。あなたの定義では、5文字の文字列(4文字とヌルターミネータ)として定義されていますが、HIVEファイルには、マジックナンバーの後にヌルターミネータがありません。ファイルの5番目のバイトは別のフィールドです。

ファイルをに直接マップしようとすると、structとにかく機能しない場合があります。Astructはメモリ内のレイアウトを定義し(適切なパディングとnullで終了する文字列などの仮定を使用)、ディスクフォーマットは通常、適切にレイアウトされた構造に直接マップされません。byte[]ファイルをバッファに読み込んで手動で解析する方がよいでしょう。

于 2012-04-27T13:59:41.857 に答える