【问题标题】:Chr from VB6 translated to C#Chr 从 VB6 翻译成 C#
【发布时间】:2013-11-26 13:41:52
【问题描述】:

我正在将一些硬件通信代码从 VB6 转换为 C#,但需要将字符发送到设备的 som 通信出现问题。 VB6 代码如下所示:

Dim STARTQUEST As String
STARTQUEST = Chr(254) + Chr(address + 8) + Chr(address) + Chr(20) + Chr(128) + Chr(3)

我已经完成了这个 C# 代码

String m_startQuest = "";
m_startQuest = m_startQuest + (Char)254 + (Char)(address + 8) + (Char)address + (Char)20 + (Char)128 + (Char)3;

但我觉得我没有从他们那里得到相同的输出。至少在调试中STARTQUEST 字符串看起来有很大不同。有没有其他方法可以让 vb6 函数在 C# 中做同样的事情?

【问题讨论】:

  • 从字符代码看来,您应该使用 byte[] 而不是字符串。
  • C# 和 VB6 之间是否有区别是使用 byte[] 的原因?由于我知道的 VB6 代码正在工作:)

标签: c# vb6 char chr


【解决方案1】:

一种选择是添加对 Microsoft.VisualBasic 的引用并使用 Strings.Chr 函数

Chr 在幕后所做的事情比您想象的要多得多(请参阅链接)。

【讨论】:

  • 这个我很喜欢。没想到有这种可能!
  • 已更正帖子。应该是 Strings.Chr 而不是 String.Chr.
【解决方案2】:
m_startQuest += Encoding.ASCII.GetString(
  new byte[] {254, address + 8, address, 28, 128, 3}
);

为什么是字节? .Net char 类型支持 Unicode,可能大于 255。所以使用字节更安全。

更新:

VB6 中的运行时错误

Dim s As String
s = Chr(1) + Chr(256)
Debug.Print s

c# 中的结果是 257。

(((char)1) + ((char)256))

结果是 c# 中的字符串。

(((char)1) + "" + ((char)256))

c# 中的编译时间错误。

Encoding.ASCII.GetString(
  new byte[] { 1, 256 }
);

【讨论】:

  • 好的,这得到了与原始代码相同的结果,但我喜欢更安全的部分!是否有可能只是一些“显示错误”使 vb6 字符串看起来与 C# 字符串不同?
【解决方案3】:

使用 (Char) 类型转换可以获得 VB6 的 ChrW(不是 Chr)函数的行为。 VB6 的 Chr 函数执行 ANSIUnicode 转换 - 要在 C# 中复制它,您可以使用 System.Text.Encoding.Default.GetBytes()。

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多