从校验和计算出的 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。
我正在尝试使用 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。