1

我有一个已转换为 C# 的 VB.net 项目。代码的一部分在 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 中,该语句产生实际的片数,但在 C# 代码中它产生 0(零)。这些陈述有何不同?PieceNumber 变量在两个项目中都声明为 int。

4

3 回答 3

2

在 VB.net 中,当您使用 new Array(10) 创建一个数组时,您指示其上限为 10,因此它包含 11 个元素。

在 C# 中,new Array(10) 将创建一个包含 10 个元素(从 0 到 9)的数组。我想这是你问题的根源。

于 2012-10-02T13:04:01.107 回答
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();

你对其他两个字符串也这样做吗?如果是简单的重写,为什么会有区别?

于 2012-10-02T13:00:57.230 回答
0

以下代码(在 LinQPad 中)按预期工作。给我们一些样本数据来调查。

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();  

}
于 2012-10-02T13:14:03.820 回答