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

他の 2 つの文字列についても同じことを行うのですか? 単純な書き直しである場合、なぜ違いがあるのでしょうか?

于 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 に答える