【发布时间】:2015-10-27 01:56:58
【问题描述】:
对于加密应用程序,我正在读取表示十六进制的字符串(“36E06921”、“27EA3C74”),并且需要将它们异或并返回结果的 str(“110A5555”)。我能够逐个字符对字符进行异或运算并获得十进制结果,但是在获取结果的 ascii 表示时遇到问题。所以,0x3 xor 0x3 = 0x0。将值 0 转换为 ascii 值 0x30 的最佳方法是什么?
目前的实施尝试:
def xor_hexstrings(xs, ys):
bin_x = binascii.unhexlify(xs)
bin_y = binascii.unhexlify(ys)
hex_str = ""
for x,y in zip(xs, ys):
# fails, with error TypeError: 'int' does not support the buffer interface
xored = binascii.b2a_hex(int(x, 16) ^ int(y, 16))
hex_str += xored
return None
编辑:关闭,唯一的问题是零。以下示例显示了推荐的解决方案将空字符串返回为零。
>>> hex(int('0', 16)).lstrip("0x")
''
>>> hex(int('1', 16)).lstrip("0x")
【问题讨论】:
-
你不能只对单个字符进行异或运算,因为它们并不都在一个连续的范围内。你需要先把hex转成int,xor,然后再把int转成hex。
-
添加的示例显示 im 不仅仅是异或 ascii 值。
-
要将每个数字转换回十六进制,只需使用
hex(digit)并去掉开头的0x。 -
也许我应该说“切片”而不是“条带”。试试
hex(0)[2:]。