所以我上个月左右一直在学习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()
中还有一个额外的参数。任何帮助将不胜感激。
答案 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))
这就是您所需要的。
这本书的功能是在做不必要的事情,只是使您感到困惑。 不要猛烈抨击这本书,但是那本书中的代码有点糟糕。