对于加密应用程序,我读取表示十六进制的字符串(" 36E06921"," 27EA3C74")并且需要将它们放在一起并返回一个str结果(" 110A5555")。我能够通过char对char进行xor并获得十进制结果,但是在获取结果的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")
答案 0 :(得分:2)
您可以执行以下操作:
x = "36E06921"
y = "27EA3C74"
z = ''.join([format((int(i,16)^int(j,16)),'X') for i,j in zip(x,y)])
print z
输出:
110A5555
答案 1 :(得分:0)
我猜你需要这个:
>>> base10_int = int('0x0',16)
>>> base10_int_str = str(base10_int)
>>> base10_ascii_val = ord(base10_int_str)
>>> hex_ascii_val = hex(base10_ascii_val)
>>> hex_ascii_val
'0x30'
答案 2 :(得分:0)
将Python 3中的模式调整为Python 2上可用的类型:使用类似字节的对象来获得自然的int
迭代:
import binascii
from operator import xor
def xor_hex(xs, ys):
xs = bytearray(binascii.unhexlify(xs))
ys = bytearray(binascii.unhexlify(ys))
return binascii.hexlify(bytearray(map(xor, xs, ys))) # Stick a .upper() on this if it must produce uppercase hex
>>> print xor_hex( "36E06921", "27EA3C74" )
110a5555
在Python 3中,它更简单,因为您可以直接使用bytes
类型而不是从Py2 str
转换为bytearray
来获取bytes
- 就像行为:
def xor_hex(xs, ys):
xs = binascii.unhexlify(xs)
ys = binascii.unhexlify(ys)
return binascii.hexlify(bytes(map(xor, xs, ys)))
虽然与使用Python 3的int.to_bytes
和int.from_bytes
方法(无可否认会产生更加丑陋的代码)相比,即使这样做也相当慢。
答案 3 :(得分:-1)
我认为你在这里要问的是将一个整数转换成它的相应字符串表示。至少那是示例0x0 - > 0x30似乎暗示。如果是这样,只需使用str()
函数转换为python中的字符串。
>>> ord(str(0))
48
仅供参考48等于0x30,ord()函数给出字符的整数表示。
编辑: 查看格式功能。似乎有预期的行为!
>>> format(0x0, 'x')
'0'