试图将hexdump从Python2转换为Python3

问题描述 投票:0回答:1

所以我上个月左右一直在学习Python3。我现在正在阅读Justin Seitz的“Black Hat Python”,但所有的代码都在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()还有一个额外的论点。任何帮助将不胜感激。

python hexdump
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.