0

次のコードを C# から VB.NET に変換するのに問題があります。

C# コード

public static byte Crc8(byte[] data, int size) {
    byte checksum = 0;
    for (int i=0; i<=size; i++)
        checksum += data[i];

    return (byte)(-checksum);
}

VB.NET コード

Public Shared Function Crc8(ByVal data As Byte(), ByVal size As Integer) As Byte
    Dim checksum As Byte = 0
    For i As Integer = 0 To size - 1
        checksum += data(i)
    Next

    Return CByte(-checksum)
End Function

問題は、VB コードが「算術演算でオーバーフローが発生した」という結果になることです。エラー。

「+=」演算子は同じように動作しないようです。VB では実際に合計 (100 + 200 = 300) を作成し、C# ではバイトに対して何らかの操作を実行しています (100 + 200 = 44)。どのような操作を行っているのかわかりません。

4

2 に答える 2

4

違いは、デフォルトでは、C#はラップするだけでオーバーフローを処理するため、255 + 1は0になります。VBでは、デフォルトでは、オーバーフローがスローされますSystem.OverflowException

checkedC#では、 anduncheckedキーワードを使用して、これをきめ細かく制御できます。プロジェクト全体のデフォルトを変更することもできます。たとえば、Noda Timeでは、オーバーフローを見つけるためにチェック演算をオンにしましたが、ブロックを使用してハッシュコード生成(オーバーフローが発生する可能性が高く無害な場合)ではオフにすることを意図しています。unchecked

残念ながら、私が知る限り、VBにはきめ細かい制御がありません。[整数のオーバーフローチェックを削除]オプションを使用して、プロジェクト全体のオーバーフローチェックをオフにすることはできますが、コードの一部のセクションだけでオフにすることはできません。

したがって、あなたの場合、オーバーフローチェックをオフにできる別のプロジェクトにこのコードを移動する、プロジェクト全体でオーバーフローチェックをオフにして生きる必要があります。

(余談ですが、これによりGetHashCodeVBでの実装が少し面倒になるようです。)

于 2013-02-15T09:23:24.613 に答える
0

今後の参考のために、解決策は次のとおりです。

Public Shared Function Crc8(ByVal data As Byte(), ByVal size As Integer) As Byte
        Dim checksum As Byte = 0
        For i As Integer = 0 To size - 1
            checksum = (CInt(checksum) + data(i)) Mod 256
        Next
        If checksum = 0 Then
            Return 0
        Else
            Return CByte(256 - checksum)
        End If
    End Function
于 2013-02-15T09:41:38.227 に答える