首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从校验和计算的不正确的LRC值

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

Stack Overflow用户
提问于 2015-04-10 20:01:46
回答 2查看 3.2K关注 0票数 1

我试图用Python计算LRC (纵向冗余检查)值。我的Python代码是从StackOverflow上的其他帖子中提取的。看起来是这样的:

代码语言:javascript
复制
lrc = 0
for b in message:
    lrc ^= b
print lrc

如果插入值'\x02\x47\x30\x30\x03',则得到LRC值70或0x46 (F),但是,我期望值为68-0x44 (D)。

我通过C#代码计算了正确的LRC值:

代码语言:javascript
复制
byte LRC = 0;
for (int i = 1; i < bytes.Length; i++)
 {
     LRC ^= bytes[i];
 }
 return LRC;

如果插入相同的字节数组值,就会得到预期的0x44结果。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-10 20:07:46

数组在C#中是0-有序的,所以通过从int i = 1;开始迭代,您将跳过1字节。

Python的结果是正确的。

固定参考代码:

代码语言:javascript
复制
byte LRC = 0;
for (int i = 0; i < bytes.Length; i++)
{
     LRC ^= bytes[i];
}
return LRC;

为了避免这样的错误,您应该考虑使用foreach语法糖(尽管我不熟悉C#实践)。

/edit

要跳过Python中的第一个字节,只需使用slice syntax

代码语言:javascript
复制
lrc = 0
for b in message[1:]:
    lrc ^= b
print lrc
票数 2
EN

Stack Overflow用户

发布于 2015-04-10 20:46:37

所以我想出了我问题的答案。感谢Nsh的洞察力。我找到了一种让算法工作的方法。我只需要跳过for-循环中的第一个字节。也许有更好的方法来做到这一点,但它是快速和可读的。

代码语言:javascript
复制
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。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29569791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档