十六进制数(0-15)并返回ascii表示

时间:2015-10-27 01:56:58

标签: python string ascii

对于加密应用程序,我读取表示十六进制的字符串(" 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")

4 个答案:

答案 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_bytesint.from_bytes方法(无可否认会产生更加丑陋的代码)相比,即使这样做也相当慢。

答案 3 :(得分:-1)

我认为你在这里要问的是将一个整数转换成它的相应字符串表示。至少那是示例0x0 - > 0x30似乎暗示。如果是这样,只需使用str()函数转换为python中的字符串。

>>> ord(str(0))
48

仅供参考48等于0x30,ord()函数给出字符的整数表示。

编辑: 查看格式功能。似乎有预期的行为!

>>> format(0x0, 'x')
'0'