我试过维基百科的例子: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”,我做错了什么?

谢谢。

最佳答案

这是一个清理过的版本,它不会执行所有这些无用的操作(而不是每次都丢弃高位,它们最终会一次性全部丢弃),它给出了您观察到的结果。这是使用加法的版本,但最后有一个否定 - 不妨减去并跳过否定。即使在溢出的情况下,这也是一个有效的转换。

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

这是替代的 LRC(一个简单的字节异或)
public static byte calculateLRC(byte[] bytes)
{
    byte LRC = 0;
    for (int i = 0; i < bytes.Length; i++)
    {
        LRC ^= bytes[i];
    }
    return LRC;
}

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

关于c# - 如何计算纵向冗余校验(LRC)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12799122/

10-10 20:16