2

我正在尝试从 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;

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

如何解决?

提前致谢。

4

1 回答 1

2

将其编组为ByValArray

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

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

尝试直接将文件映射到 astruct可能无论如何都行不通。Astruct定义了内存中的布局(具有适当的填充和假设,如以空字符结尾的字符串),并且磁盘格式通常不会直接映射到布局良好的结构。byte[]将文件读入缓冲区并手动解析它可能会更好。

于 2012-04-27T13:59:41.857 回答