c# - VB.Net 到 C# 字节 array 问题

  显示原文与译文双语对照的内容
0 0

我有一个 VB.Net 项目,我已经转换到 C# 。 代码中的一个部分在 C# 中产生了不同于 VB.Net 中的结果。 谁能告诉我 C# 代码的错误,以及如何修复它?

VB.Net:

Private Sub mco_GetDataReturn(ByVal TransactionNumber As Short, ByVal DataType As ModiconComunications.ModiconComObject.GetDataType, ByVal Success As Boolean, ByVal UserData() As Byte) Handles mco.GetDataReturn
 OrderNumber =""
 HeatNumber =""
 If UserData.GetUpperBound(0) <17 Then
 'MsgBox("ModComm1_GetDataReturn - Not enough data returned from PLC read :" & UBound(UserData, 1) + 1 &" bytes")
 ReDim Preserve UserData(0 To 17)
 ElseIf UserData.GetUpperBound(0)> 17 Then
 'MsgBox("ModComm1_GetDataReturn - Too much data returned from PLC read :" & UBound(UserData, 1) + 1 &" bytes")
 ReDim Preserve UserData(0 To 17)
 End If
 OrderNumber = System.Text.Encoding.ASCII.GetChars(UserData, 0, 8)
 OrderRelease = System.Text.Encoding.ASCII.GetChars(UserData, 8, 2)
 HeatNumber = System.Text.Encoding.ASCII.GetChars(UserData, 10, 6)
 PieceNumber = UserData(16) * 256 + UserData(17)
 End Sub

C#:

private void mco_GetDataReturn(short TransactionNumber, ModiconComunications.ModiconComObject.GetDataType DataType, bool Success, byte[] UserData)
 {
 OrderNumber ="";
 HeatNumber ="";
 if (UserData.GetUpperBound(0) <17)
 {
 Array.Resize(ref UserData, 18);
 }
 else if (UserData.GetUpperBound(0)> 17)
 {
 Array.Resize(ref UserData, 18);
 }
 OrderNumber = System.Text.Encoding.ASCII.GetString(UserData, 0, 8).ToString();
 OrderRelease = System.Text.Encoding.ASCII.GetString(UserData, 8, 2).ToString();
 HeatNumber = System.Text.Encoding.ASCII.GetString(UserData, 10, 6).ToString();
 PieceNumber = UserData[16] * 256 + UserData[17];
 }

具体的问题是PieceNumber最后一个语句。 在 VB.Net 中,语句生成实际的Fragment号,但是在 C# 代码中,它生成 0个( 零) 。 这些语句是如何不同的? 在两个项目中,PieceNumber变量被声明为一个 int 。

时间:原作者:5个回答

0 0

在 VB.Net 中,当创建带有新 Array(10),的array 时,指示它的上限将为 10,因这里它包含 11个元素。

在 C# 中,新的Array(10) 将创建 10个元素( 从 0到 9 )的array 。 我想这是你的问题的root 。

原作者:
0 0

它不依赖于 UserData的初始内容? 你确定用同样的参数调用它?

如果是 10字节,将它的调整为 18字节,则'新建'值将为零。

从而 UserData[16] * 256 + UserData[17] = = 0 * 256 + 0 = 0

另外在VB里

OrderNumber = System.Text.Encoding.ASCII.GetChars(UserData, 0, 8)

在 C# 里你有

OrderNumber = System.Text.Encoding.ASCII.GetString(UserData, 0, 8).ToString();

你也可以为其他两个字符串进行操作? 如果是简单重写的原因?

原作者:
0 0

下面的代码( in ) 按预期工作。 给我们一些样本数据来调查。

var testData = new Dictionary<string, int> {
 {"01234567890123", 0 },
 {"012345678901234", 0 },
 {"0123456789012345", 0 },
 {"01234567890123456", 13824 },
 {"012345678901234567", 13879 },
 {"0123456789012345678", 13879 },
 {"01234567890123456789", 13879 },
 {"012345678901234567890", 13879 }
};
foreach (var pair in testData){
 var testCase = pair.Key;
 var expected = pair.Value;
 var UserData = System.Text.Encoding.ASCII.GetBytes(testCase);
 if (UserData.GetUpperBound(0) <17)
 {
 Array.Resize(ref UserData, 18);
 }
 else if (UserData.GetUpperBound(0)> 17)
 {
 Array.Resize(ref UserData, 18);
 }
 var OrderNumber = System.Text.Encoding.ASCII.GetString(UserData, 0, 8).ToString();
 var OrderRelease = System.Text.Encoding.ASCII.GetString(UserData, 8, 2).ToString();
 var HeatNumber = System.Text.Encoding.ASCII.GetString(UserData, 10, 6).ToString();
 var PieceNumber = UserData[16] * 256 + UserData[17];
 (new { 
 TestCase = testCase, 
 OrderNumber, 
 OrderRelease, 
 HeatNumber, 
 PieceNumber, 
 Success = PieceNumber == expected 
 }).Dump(); 
}
原作者:
...