我试图验证字符串的校验和,在这种情况下,通过对每个单独的字符执行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-8
和ascii
进行编码/解码,但我不确定文本的编码是什么,但两者都有相同的结果。
我在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;
答案 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代码中得到的假设是不正确的。