我正在尝试使用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。

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

最佳答案

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

08-25 06:42