从校验和计算出的 LRC 值不正确

Incorrect LRC value calculated from checksum

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

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 的预期结果。

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

数组在 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

所以我找到了问题的答案。感谢 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

它现在 returns 在我的用例中是预期的 0x44。