首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算纵向冗余校验(LRC)?

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

Stack Overflow用户
提问于 2012-10-09 19:32:18
回答 6查看 36.8K关注 0票数 5

我试过维基百科上的例子:http://en.wikipedia.org/wiki/Longitudinal_redundancy_check

这是lrc (C#)的代码:

代码语言:javascript
复制
/// <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",我做错了什么?

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-10-09 19:46:02

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

代码语言:javascript
复制
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 )

代码语言:javascript
复制
public static byte calculateLRC(byte[] bytes)
{
    byte LRC = 0;
    for (int i = 0; i < bytes.Length; i++)
    {
        LRC ^= bytes[i];
    }
    return LRC;
}

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

票数 14
EN

Stack Overflow用户

发布于 2013-09-11 06:15:10

我猜这个看起来更酷;)

代码语言:javascript
复制
public static byte calculateLRC(byte[] bytes)
{
    return bytes.Aggregate<byte, byte>(0, (x, y) => (byte) (x^ y));
}
票数 5
EN

Stack Overflow用户

发布于 2013-10-09 19:24:11

如果有人想要从字符串中获取LRC字符:

代码语言:javascript
复制
    public static char CalculateLRC(string toEncode)
    {
        byte[] bytes = Encoding.ASCII.GetBytes(toEncode);
        byte LRC = 0;
        for (int i = 0; i < bytes.Length; i++)
        {
            LRC ^= bytes[i];
        }
        return Convert.ToChar(LRC);
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12799122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档