【问题标题】:how to convert c++ char read using "Marshal.ReadByte" to c# char?如何将使用“Marshal.ReadByte”读取的 c++ char 转换为 c# char?
【发布时间】:2013-06-25 18:43:56
【问题描述】:

在 c++ 中,我有常规的 char(类似于 'J' '0' 等)。我使用Marshal.ReadByte 方法在c# 中阅读它。所以现在在 c# 中我有字节。如何将此字节转换为字符?所以我想将c++中的'J'转换为c#中的'J'。

【问题讨论】:

标签: c#


【解决方案1】:

假设源 char 使用 ASCII 或 Latin-1 (ISO 8859-1),在 C# 中你会使用 char ch = (char)Marshal.ReadByte(...);

这是因为 ASCII 和 Latin-1 编码是 Unicode 的子集。 .NET char 是一个 UTF-16 代码单元,只需一个演员表就可以很好地适应其中的每一个。

如果您认为您会处理其他源编码,更好的选择可能是在字节数组上使用Encoding.GetString()。请记住,某些编码需要多个单元来编码单个代码点(UTF-8、EUC-JP、Shift-JIS 等),因此单个 char 可能不够。

【讨论】:

  • 您不能将byte 隐式转换为char(但可以显式转换)。
  • 可能我应该添加演员,但我认为可能存在更强大和优雅的解决方案......
  • @javapowered 以何种方式更健壮?我怀疑您是否需要处理 EBCDIC。如果您担心像 UTF-8 这样的编码,那么这与 C# chars 不是一对一的,您确实需要在整个字符串上使用类似 Encoding.GetString() 的东西,正如 Cory 建议的那样。而且我认为 cast “我有 X 类型的变量并想将其转换为 Y 类型”的最优雅的解决方案。
  • 我只需要它工作。总是。投射总是有效吗?因为我将 1 字节变量转换为 2 字节变量,所以我完全不确定如何处理。
  • 如果源编码是 ASCII,转换将始终有效。 ASCII(字符 0 到 127)直接映射到 Unicode,并且每次都会无损地转换为 .NET char(代表 UTF-16 代码单元)。
猜你喜欢
  • 2012-07-01
  • 2015-04-02
  • 2013-12-31
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
相关资源
最近更新 更多