如何在 python 中使用 XOR 遍历列表

How to iterate through a list using XOR in python

所以我得到了以下代码:

telegram = "[=11=];02;A1;00000000*49"
checksum = telegram[10:18]                           # is 00000000
for x in telegram[1:]:
    x = "{0:08b}".format(int(hex(ord(x)),16))
    print (x)

输出字符串每个字符的二进制值telegram:

00110000
00110000
00111011
00110000
00110010
00111011
01000001
00110001
00111011
00110000
00110000
00110000
00110000
00110000
00110000
00110000
00110000
00101010
00110100
00111001

现在我想得到电报的校验和,这意味着我必须使用按位运算符^。我确实得到了这样的正确结果:

#--snip--

firstdigit = "{0:08b}".format(int(hex(ord(telegram[1])),16))            # telegram[1] = 0
result_1 = int(firstdigit) ^ int(checksum)
print (f'{result_1:08}')                                          # is 00110000

seconddigit = "{0:08b}".format(int(hex(ord(telegram[2])),16))           # telegram[2] =0
result_2 = int(result_1) ^ int(seconddigit)
print (f'{result_2:08}')                                          # is 00000000                    

thirddigit = "{0:08b}".format(int(hex(ord(telegram[3])),16))            # telegram[3] =;
result_3 = int(result_2) ^ int(thirddigit)
print (f'{result_3:08}')                                          # is 00111011  

...等等。 (正确)输出:

00110000
00000000
00111011

但这样做似乎真的很不方便,这让我想到了我的 实际问题 :我想遍历字符串 telegram 以获得所需的输出和我只是无法掌握它。如果你能帮助我,我将不胜感激!

您可以在每个字符上使用函数 ord() 跳过到二进制字符串的转换。例如:

>>> telegram = "[=10=];02;A1;00000000*49"
>>> ord(telegram[1]) ^ ord(telegram[2])
0

您可以使用列表理解将所有字符转换为序数:

>>> [ord(n) for n in telegram[1:]] # all but first character...
[48, 48, 59, 48, 50, 59, 65, 49, 59, 48, 48, 48, 48, 48, 48, 48, 48, 42, 52, 57]

使用标准库中的工具,例如 functools.reduce and operator.xor,您可以将所有值异或在一起:

>>> import functools
>>> import operator
>>> functools.reduce(operator.xor,[ord(n) for n in telegram[1:]])
110
>>> format(110,'08b') # binary if needed
'01101110'