结构编组,封送ANSI和Unicode

本文关键字:ANSI Unicode 封送 结构 | 更新日期: 2023-09-27 18:32:30

我正在尝试从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"幻数,我得到不可读的字符。

如何解决?

提前谢谢。

结构编组,封送ANSI和Unicode

将其

封送为ByValArray

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

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

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