Python:XOR字符串中的每个字符

2024-05-12 12:55:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图验证一个字符串的校验和,在本例中,它是通过对每个单独的字符执行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;

Tags: 字符串内容check字符校验intscannersum
2条回答

我创建了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;
}

当我编译并运行它时:

^{pr2}$

这让我相信你从等价的C代码中得到的假设是不正确的。在

因此,正如@metatoaster、@XD573和评论中的其他人所帮助解决的问题一样,问题在于结果(以10为基数)与我期望的解决方案(以16为基数)之间的差异。在

代码40的结果是正确的——以10为基数,但是我试图实现的正确值是以16为基数的。只需将解从基数16转换为基数10,例如:

int('28', 16)

我得到40,计算结果。在

相关问题 更多 >