如何在 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'
所以我得到了以下代码:
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'