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

时间:2015-04-10 20:01:46

标签: python checksum

我试图用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。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

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