【问题标题】:structure marshalling, marshal both ansi and unicode结构编组,编组 ansi 和 unicode
【发布时间】:2012-05-08 06:01:50
【问题描述】:

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

如何解决?

提前致谢。

【问题讨论】:

  • 你可以通过只用字符串伪造一个额外的结构来做到这一点。在这里不起作用,它不是以零结尾的字符串。编组为 byte[] 或 int32 是正确的。这是一个数字。

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


【解决方案1】:

改为将其编组为ByValArray

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

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

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

【讨论】:

  • 是的,你可能是对的。我真的不需要它作为字符串,我什至可以将它编组为整数。这解决了我的问题,但是如果有一种方法可以在一个结构中同时包含 unicode 和 ansi 字符串,我仍然很感兴趣?谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2019-07-23
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多