如何计算纵向冗余校验(LRC)?

Ale*_*rez 3 c# checksum parity

我试过维基百科的例子: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;
}   
Run Code Online (Sandbox Code Playgroud)

它说结果是"EC",但我得到"71",我做错了什么?

谢谢.

har*_*old 9

这是一个清理版本,它没有完成所有那些无用的操作(不是每次丢弃高位,而是最后一次丢弃它们),它给出了你观察到的结果.这是使用加法的版本,但最后有一个否定 - 也可以减去并跳过否定.即使在溢出的情况下,这也是有效的转换.

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

这是备用LRC(简单的xor字节)

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

在这种情况下,维基百科在代码(不编译)和预期结果中都是错误的.


Omi*_*doo 5

猜猜这个看起来更酷;)

public static byte calculateLRC(byte[] bytes)
{
    return bytes.Aggregate<byte, byte>(0, (x, y) => (byte) (x^ y));
}
Run Code Online (Sandbox Code Playgroud)