我正在尝试从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”幻数我会得到不可读的字符。
如何解决这个问题?
提前致谢。
答案 0 :(得分:2)
将其标记为ByValArray
而不是:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
public byte[] MagicNumber;
你不需要它作为一个字符串,如果你将它设置为字符串,Marshaller可能会失败。在你的定义中,你将它定义为一个5个字符的字符串(4个字符加上一个空终止符) - 但是在魔术数字后,HIVE文件将没有空终止符,该文件的第5个字节是另一个字段。
尝试直接将文件映射到struct
可能无法正常工作。 struct
定义内存布局(具有适当的填充和假设,如空终止字符串),并且磁盘格式通常不直接映射到布局良好的结构。您可能最好将文件读入byte[]
缓冲区并手动解析它。