我将尝试验证一个字符串的校验和,这个字符串是通过对每个单独字符执行异或运算计算得出的。以下是测试字符串:
我知道结果应该是
我不确定文本应该使用哪种编码,虽然我尝试过使用
我在C中实现了相同的算法,只需对char数组进行XOR即可得到完美的结果,那我错过了什么?
编辑
所以,我实现(我认为)在C中也是同样的事情已经有一段时间了。我知道它是在一个Objective-C项目中,但我认为我只是这样做了。完全错误,首先有一步,我将最后的校验和字符串值转换为十六进制,如下所示(我在这里填写了一些内容,以便只粘贴相关的内容):
然后,我将进行如下比较:
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;
map(ord, check_against)
,然后使用operator.xor
进行缩减,像这样reduce(xor, map(ord, check_against))
。在Python 3中,它将变为functools.reduce
。 - metatoasterutf-8
和ascii
是死胡同,因为ASCII字符在Unicode中具有相同的值。在Python 2中,bytearray(check_against, encoding='utf-8') == bytearray(check_against)
返回True
。 - chucksmash40
和16进制下的0x28
。你是如何用C生成输出28
的? - metatoaster40
。链接:https://ideone.com/YK8FOp - Daniel Prydenprintf("%x\n", 40);
的结果是打印出28
。 - metatoaster