我试图用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结果。
在功能上,代码看起来非常相似。所以我想知道代码之间有什么区别。这是我的输入值吗?我应该用不同的格式设置字符串吗?
发布于 2015-04-10 20:07:46
数组在C#中是0-有序的,所以通过从int i = 1;开始迭代,您将跳过1字节。
Python的结果是正确的。
固定参考代码:
byte LRC = 0;
for (int i = 0; i < bytes.Length; i++)
{
LRC ^= bytes[i];
}
return LRC;为了避免这样的错误,您应该考虑使用foreach语法糖(尽管我不熟悉C#实践)。
/edit
要跳过Python中的第一个字节,只需使用slice syntax
lrc = 0
for b in message[1:]:
lrc ^= b
print lrc发布于 2015-04-10 20:46:37
所以我想出了我问题的答案。感谢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。
https://stackoverflow.com/questions/29569791
复制相似问题