我试图用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。
从功能上讲,代码看起来非常相似。所以我想知道代码之间的区别。这是我的投入价值吗?我应该以不同的方式格式化我的字符串吗?
答案 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。