2012-04-27 12 views
2

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

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

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

LPStrタイプも使用しようとしていますが、全く動作しません。代わりに「REGF」私は読めない文字を取得するマジックナンバーのmarshalignこのタイプの

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

これを修正するにはどうすればよいですか?

ありがとうございます。代わりにByValArrayとして

+0

文字列だけで余分な構造体を見せかけることで、これを行うことができます。ここでは動作しません。ゼロ終端文字列ではありません。 byte []またはint32としての整列化は正しいです。それは数字です。 –

答えて

2

元帥は:

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

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

ファイルを直接structにマップしようとすると、うまく動作しないことがあります。 structは、メモリレイアウト(適切な埋め込みとNULL終了文字列のような仮定)を定義し、ディスクフォーマットは通常、レイアウトされた構造に直接マップしません。おそらくファイルをbyte[]バッファに読み込み、手動で解析する方がよいでしょう。

+0

ええ、あなたはおそらく正しいでしょう。私は実際に文字列としてそれを必要としません、私は整数としてマーシャリングすることもできます。それは私の問題を解決しますが、ユニコードとアンシの両方の文字列を1つの構造に持つ方法があれば、それはまだ興味深いのですか?ご回答有難うございます。 – axe

関連する問題