2012-04-27 58 views
2

我想從Windows HIVE文件中讀取基本塊。文件的前4個字節包含「regf」幻數。這個字符串是ANSI,但也有unicode字符串。 如果我指定MarshalAs屬性並將類型設置爲ByValTStr,則它工作正常,但它不讀取unicode字符串。 MSDN說如果你使用ByValTStr,那麼數組的類型由包含結構的字符集決定。問題是如果我爲整個結構設置字符集爲unicode,那麼我無法讀取幻數(前4個字節)。結構編組,處理ansi和unicode

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

如何更改特定字符串的字符集,而不是整個結構?

我也試圖使用LPStr類型,但它根本不起作用。

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

對於這種類型的marshalign代替「regf」神奇的數字,我得到亂碼的。

如何解決這個問題?

在此先感謝。

+0

你可以通過僞造一個額外的結構,只用字符串。在這裏不起作用,它不是以零結尾的字符串。作爲byte []或int32封送是正確的。這是一個數字。 – 2012-04-27 14:09:46

回答

2

元帥它作爲一個ByValArray代替:

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

你並不需要它作爲一個字符串,如果你把它設置爲一個字符串的Marshaller可能會失敗。在你的定義中,你將它定義爲一個5個字符的字符串(4個字符加上一個空終止符) - 但是HIVE文件在魔數之後沒有空終止符,文件的第5個字節是另一個字段。

試圖將文件直接映射到struct可能無法正常工作。 A struct定義了一個內存中的佈局(有適當的填充和假設,如null終止的字符串),並且磁盤格式通常不直接映射到佈局良好的結構。將文件讀入byte[]緩衝區並手動解析它可能會更好。

+0

是的,你可能是對的。我真的不需要它作爲字符串,我甚至可以將它作爲一個整數進行編碼。這解決了我的問題,但是如果有一種方法可以在一個結構中同時使用unicode和ansi字符串,我仍然很感興趣。感謝您的回答。 – axe 2012-04-27 14:02:36