5

ウィキペディアの例を試してみました: http://en.wikipedia.org/wiki/Longitudinal_redundancy_check

これは lrc (C#) のコードです:

/// <summary>
/// Longitudinal Redundancy Check (LRC) calculator for a byte array. 
/// ex) DATA (hex 6 bytes): 02 30 30 31 23 03
///     LRC  (hex 1 byte ): EC    
/// </summary> 
public static byte calculateLRC(byte[] bytes)
{
    byte LRC = 0x00;
    for (int i = 0; i < bytes.Length; i++)
    {
        LRC = (LRC + bytes[i]) & 0xFF; 
    }
    return ((LRC ^ 0xFF) + 1) & 0xFF;
}   

結果は「EC」と言われましたが、「71」と表示されました。何が間違っていますか?

ありがとう。

4

6 に答える 6

14

これは、これらの無駄な操作をすべて実行しないクリーンアップされたバージョンです (毎回上位ビットを破棄するのではなく、最終的に一度にすべて破棄されます)。観察した結果が得られます。これは加算を使用するバージョンですが、最後に否定があります。減算して否定をスキップすることもできます。これは、オーバーフローの場合でも有効な変換です。

public static byte calculateLRC(byte[] bytes)
{
    int LRC = 0;
    for (int i = 0; i < bytes.Length; i++)
    {
        LRC -= bytes[i];
    }
    return (byte)LRC;
}

これが代替LRCです(バイトの単純なxor)

public static byte calculateLRC(byte[] bytes)
{
    byte LRC = 0;
    for (int i = 0; i < bytes.Length; i++)
    {
        LRC ^= bytes[i];
    }
    return LRC;
}

この場合、ウィキペディアは、コード (コンパイルされない) と期待される結果の両方で、単純に間違っています。

于 2012-10-09T11:46:02.037 に答える
5

これはもっとクールに見えると思います;)

public static byte calculateLRC(byte[] bytes)
{
    return bytes.Aggregate<byte, byte>(0, (x, y) => (byte) (x^ y));
}
于 2013-09-10T22:15:09.630 に答える
0

修正版ウィキペディアは次のとおりです。

private byte calculateLRC(byte[] b)
    {
        byte lrc = 0x00;
        for (int i = 0; i < b.Length; i++)
        {
            lrc = (byte)((lrc + b[i]) & 0xFF);
        }
        lrc = (byte)(((lrc ^ 0xff) + 2) & 0xFF);
        return lrc;
    }
于 2013-03-16T15:24:30.417 に答える