0

我正在将一些硬件通信代码从 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# 中做同样的事情?

4

3 回答 3

2

One option would be to add a reference to Microsoft.VisualBasic and use the Strings.Chr function

Chr is doing a lot more behind the scenes than you may realize (see the link).

于 2013-11-26T14:26:18.807 回答
1
m_startQuest += Encoding.ASCII.GetString(
  new byte[] {254, address + 8, address, 28, 128, 3}
);

为什么是字节?.Netchar类型支持 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 }
);
于 2013-11-26T13:55:05.403 回答
0

Using the (Char) cast gets you the behaviour of VB6's ChrW (not Chr) function. VB6's Chr function does an ANSI<->Unicode conversion - to duplicate this in C# you can use System.Text.Encoding.Default.GetBytes().

于 2013-11-26T14:10:33.897 回答