VB.Net到C#字节数组问题

时间:2012-10-02 12:52:22

标签: c# vb.net-2010

我有一个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中,语句产生实际的片段号,但是在C#代码中它产生0(零)。这些陈述有何不同?在两个项目中,PieceNumber变量都被声明为int。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

是否取决于UserData的初始内容?你确定用相同的参数调用它吗?

如果它是10个字节长,并且你将它调整为18个字节,那么'new'值将为零。

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

您还可以为其他两个字符串执行此操作吗?如果它是一个简单的重写,为什么会有区别?

答案 2 :(得分: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();  

}