【问题标题】:Incorrect LRC value calculated from checksum从校验和计算的 LRC 值不正确
【发布时间】:2015-06-16 15:59:02
【问题描述】:

我正在尝试使用 Python 计算 LRC(纵向冗余检查)值。 我的 Python 代码是从 StackOverflow 上的其他帖子中提取的。它看起来像这样:

lrc = 0
for b in message:
    lrc ^= b
print lrc

如果我插入值 '\x02\x47\x30\x30\x03',我得到的 LRC 值为 70 或 0x46 (F) 但是,我期望的值为 68 - 0x44 (D)。

我已经通过 C# 代码计算出正确的 LRC 值:

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

如果我插入相同的字节数组值,我会得到 0x44 的预期结果。

在功能上,代码看起来非常相似。所以我想知道代码之间有什么区别。这是我的输入值吗?我应该以不同的方式格式化我的字符串吗?

【问题讨论】:

    标签: python checksum


    【解决方案1】:

    数组在 C# 中是 0 序的,因此通过从 int i = 1; 开始迭代,您将跳过第一个字节。

    Python 结果是正确的。

    固定参考代码:

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

    为避免此类错误,您应该考虑使用foreach 语法糖(虽然我不熟悉 C# 实践)。

    /编辑

    要跳过 Python 中的第一个字节,只需使用 slice syntax:

    lrc = 0
    for b in message[1:]:
        lrc ^= b
    print lrc
    

    【讨论】:

    • 欣赏输入,但 C# 结果是我正在寻找的结果。 Python 实现是我不满意的一个。很好的一点是它从 1 开始。我将进一步探索
    【解决方案2】:

    所以我想出了问题的答案。感谢 Nsh 的洞察力。我找到了一种使算法工作的方法。我只需要跳过 for 循环中的第一个字节。可能有更好的方法来做到这一点,但它很快而且可读。

    def calcLRC(input):
        input=input.decode('hex')
        lrc = 0
        i = 0
        message = bytearray(input)
        for b in message:
            if(i == 0):
                pass
            else:
                lrc ^= b
            i+=1;
        return lrc
    

    它现在在我的用例中返回预期的 0x44。

    【讨论】:

      猜你喜欢
      • 2015-05-17
      • 2012-09-03
      • 1970-01-01
      • 2012-09-29
      • 1970-01-01
      • 2015-04-14
      • 2016-05-31
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多