我试图验证一个字符串的校验和,在本例中,它是通过对每个单独的字符执行XOR来计算的。在
根据我的测试字符串:
check_against = "GPGLL,5300.97914,N,00259.98174,E,125926,A"
我想这很简单:
^{pr2}$我知道结果应该是28
,但是我的代码给出了40
。在
我不确定文本的编码方式,尽管我尝试过在utf-8
和{
我在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;
我创建了C版本,如下所示:
当我编译并运行它时:
^{pr2}$这让我相信你从等价的C代码中得到的假设是不正确的。在
因此,正如@metatoaster、@XD573和评论中的其他人所帮助解决的问题一样,问题在于结果(以10为基数)与我期望的解决方案(以16为基数)之间的差异。在
代码
40
的结果是正确的——以10为基数,但是我试图实现的正确值是以16为基数的。只需将解从基数16转换为基数10,例如:我得到
40
,计算结果。在相关问题 更多 >
编程相关推荐