Python:对字符串中的每个字符进行异或

时间:2015-11-09 04:47:46

标签: python checksum

我试图验证字符串的校验和,在这种情况下,通过对每个单独的字符执行XOR来计算字符串。

鉴于我的测试字符串:

check_against = "GPGLL,5300.97914,N,00259.98174,E,125926,A"

我认为它会如此简单:

result = 0
for char in check_against:
    result = result ^ ord(char)

我知道结果应为28,但我的代码为40

虽然我已尝试在utf-8ascii进行编码/解码,但我不确定文本的编码是什么,但两者都有相同的结果。

我在C中实现了相同的算法,只需在char数组上进行XOR就可以得到完美的结果,那么我缺少什么呢?

修改

所以不久之前,我实现了(我的想法)在C中是同样的事情。我知道它是在Objective-C项目中,但我认为我刚刚这样做了。完全错了,首先有一个步骤,我将最后的校验和字符串值转换为十六进制,就像这样(我在这里填写一些东西,以便我只粘贴相关的东西):

 unsigned int checksum = 0;
 NSScanner *scanner = [NSScanner scannerWithString:@"26"];
 [scanner scanHexInt:&checksum];

然后我做了以下计算校验和:

 NSString sumString = @"GPGLL,5300.97914,N,00259.98174,E,125926,A";
 unsigned int sum = 0;
 for (int i=0;i<sumString.length;i++) {
     sum = sum ^ [sumString characterAtIndex:i];
 }

然后我会像这样比较:

 return sum == checksum;

3 个答案:

答案 0 :(得分:2)

因为@metatoaster,@ XD573以及评论中的其他一些人已经帮助弄清楚,问题是结果(基数为10)与我想要的解决方案(基数为16)之间的差异。

代码的结果40是正确的 - 在基数10中,不过我正在尝试实现的正确值,28在基数16中给出。只需将解决方案从基数16转换为基数10,例如像:

int('28', 16)

我得到40,计算结果。

答案 1 :(得分:2)

#python3
str = "GPGLL,5300.97914,N,00259.98174,E,125926,A"
cks = 0
i = 0

while(i<len(str)):
    cks^=ord(str[i])
    i+=1

print("hex:",hex(cks))
print("dec:",cks)

答案 2 :(得分:0)

我创建了C版本,如下所示:

#include <stdio.h>
#include <string.h>

int main()
{
    char* str1="GPGLL,5300.97914,N,00259.98174,E,125926,A";
    int sum = 0;
    int i = 0;

    for (i; i < strlen(str1); i++) {
        sum ^= str1[i];
    }

    printf("checksum: %d\n", sum);

    return 0;
}

当我编译并运行它时:

$ gcc -o mytest mytest.c
$ ./mytest
checksum: 40

这使我相信您从等效C代码中得到的假设是不正确的。