Python 二进制数据与十进制值异或

Python xor binary data with decimal value

我对按位异或运算符的行为有点困惑。为什么,如果 xor 只能用于二进制数据,我是否可以将 xor 用于十进制数?

例如:

fs='a'
sn='k'    
ord(fs) ^ ord(sn)

ord(fs) 给我一个非二进制的 ASCII 码。

根据 Python 3 documentation 对于 built-in 函数,ord() returns 一个整数:

Given a string representing one Unicode character, return an integer representing the Unicode code point of that character. For example, ord('a') returns the integer 97 [...]

此整数由位序列表示,因此它是按位异或运算符的有效操作数。

编辑

Python 将值 97 解释为整数。并且,在内部,整数数字类型表示为一个位序列。整数类型在Numeric Types. Another section of that same documentation explains Bitwise Operations on Integer Types中有描述,它表示

Bitwise operations only make sense for integers.

也就是说,对任何其他类型(包括字符串)的按位运算在 Python 中都是无效的。

所以 ord() returns 一个整数。它在内部 表示为一个位序列。虽然它的类型不是明确的 "binary," Python 仍然定义了整数的按位 XOR 运算符。

明确地说,所有值在内部都表示为一个位序列。只是 Python 只定义了整数的按位异或运算符。

它完全按照设计工作,只是您需要将它分配给一个变量,然后打印出来。

您可以将它们(=整数)转换回像这样的二进制字符串 '{0:b}'.format(some_integer)。下面示例中的 .zfill(8) 是“零填充左侧到 8 个字符”以将它们整齐地对齐。

示例:

fs='a' 
sn='k'

#assign result to variable
r = ord(fs) ^ ord(sn)

print('fs=', str(ord(fs)).rjust(3), '{0:b}'.format(ord(fs)).zfill(8))
print('sn=', str(ord(sn)).rjust(3), '{0:b}'.format(ord(sn)).zfill(8))
print('r =', str(r).rjust(3), '{0:b}'.format(r).zfill(8))

输出:

fs=  97 01100001
sn= 107 01101011
r =  10 00001010