结构编组,编组ansi和unicode

时间:2012-04-27 13:24:59

标签: c# .net string character-encoding marshalling

我正在尝试从Windows HIVE文件中读取基本块。文件的前4个字节包含“regf”幻数。此字符串是ANSI,但也有unicode字符串。 如果我指定MarshalAs属性并将类型设置为ByValTStr它可以正常工作,但它不会读取unicode字符串。 MSDN说如果你使用ByValTStr,那么数组的类型由包含结构的字符集决定。问题是如果我将整个结构的字符集设置为unicode,那么我就无法读取幻数(前4个字节)。

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

如何更改特定字符串的字符集,而不是整个结构?

我也尝试使用LPStr类型,但它根本不起作用。

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

使用这种类型的marshalign而不是“regf”幻数我会得到不可读的字符。

如何解决这个问题?

提前致谢。

1 个答案:

答案 0 :(得分:2)

将其标记为ByValArray而不是:

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

你不需要它作为一个字符串,如果你将它设置为字符串,Marshaller可能会失败。在你的定义中,你将它定义为一个5个字符的字符串(4个字符加上一个空终止符) - 但是在魔术数字后,HIVE文件将没有空终止符,该文件的第5个字节是另一个字段。

尝试直接将文件映射到struct可能无法正常工作。 struct定义内存布局(具有适当的填充和假设,如空终止字符串),并且磁盘格式通常不直接映射到布局良好的结构。您可能最好将文件读入byte[]缓冲区并手动解析它。