试图将hexdump从Python2转换为Python3

时间:2017-10-21 23:39:26

标签: python hexdump

所以我上个月左右一直在学习Python3。我正在经历" Black Hat Python" Justin Seitz现在,但所有代码都在Python2中。到目前为止,大多数代码很容易转换为Python3,但我在tcp_proxy程序中遇到了一个hexdump函数,这让我感到难过。下面是本书中的Python2代码。

def hexdump(src, length=16):
    result = []
    digits = 4 if isinstance(src, unicode) else 2

    for i in xrange(0, len(src), length):
        s = src[i:i+length]
        hexa = b' '.join(["%0*X" % (digits, ord(x)) for x in s])
        text = b''.join([x if 0x20 <= ord(x) < 0x7F else b'.' for x in s])
        result.append(b"%04X %-*s %s" % (i, length*(digits + 1), hexa, text))

    print b'\n'.join(result)

我有一些我无法在网上找到的问题。如果数字是单个int,为什么需要解压缩?相当于"%0*X" % (digits, ord(x))"{0:X}".format(*digits, ord(x))吗?为什么这有两个论点?我注意到result.append()中还有一个额外的参数。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

这对我有用。将xrange更改为范围,isinstance不是必需的,但2to3建议它。删除了字节字符串。

def hexdump(src, length=16):
  result = []
  digits = 4 if isinstance(src, str) else 2
  for i in range(0, len(src), length):
   s = src[i:i+length]
   hexa = " ".join(map("{0:0>2X}".format,src))
   text = "".join([chr(x) if 0x20 <= x < 0x7F else "." for x in s])
   result.append("%04X   %-*s   %s" % (i, length*(digits + 1), hexa, text) )
  return "\n".join(result)

答案 1 :(得分:0)

def hexdump(src, length=16):
    result = []
    digits = 4

    s = src[:]
    print(s)
    hexa = " ".join(["%0*X" % (digits, ord(x)) for x in s.decode("ascii")])
    text = "".join([x if 0x20 <= ord(x) < 0x7F else "." for x in s.decode("ascii")])
    result.append("%04X   %-*s   %s" % (1, length * (digits + 1), hexa, text))

    print("\n".join(result))

这就是您所需要的。

这本书的功能是在做不必要的事情,只是使您感到困惑。 不要猛烈抨击这本书,但是那本书中的代码有点糟糕。