【问题标题】:Hex number (0-15) and return ascii representation十六进制数 (0-15) 并返回 ascii 表示
【发布时间】: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:]

标签: python string ascii


【解决方案1】:

您可以执行以下操作:

x = "36E06921"
y = "27EA3C74"
z = ''.join([format((int(i,16)^int(j,16)),'X') for i,j in zip(x,y)])
print z

输出:

110A5555

【讨论】:

  • 如果您使用'X'(大写)而不是'x'(小写)的格式字符串,则无需使用upper()
【解决方案2】:

我猜你需要这个:

>>> 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'

【讨论】:

    【解决方案3】:

    将 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 方法(诚然会产生更丑陋的代码)相比,这还是相当慢。

    【讨论】:

      【解决方案4】:

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

      >>> ord(str(0))
      48
      

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

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

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

      【讨论】:

      • 这适用于纯十进制数字,但不适用于十六进制。
      • 这似乎接近我想要的,但是说我的异或结果是 13,十六进制 0xD。类似的东西能处理这个吗?
      • 所以给定 int 13,你想要十六进制 0xD?你可以做十六进制(13)
      • 使用了 hex(x).lstrip("0x") 并得到了非常接近的结果。唯一的问题是 '0' 没有被添加到字符串 >>>hex(0).lstrip("0x) ''
      猜你喜欢
      • 2018-12-06
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多