【发布时间】:2017-10-21 23:39:26
【问题描述】:
所以上个月左右我一直在学习 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 3 中使用
%格式。请参阅docs.python.org/3/library/… 上的文档。您的主要问题是将bytes文字(以b'开头)与字符串(不带b)混合在一起。 -
为了minimal reproducible example 的利益,src 的价值是什么?我在“unicode”上收到 NameError。此外,如果您在 python3 中运行它,则打印函数需要括号。此链接可能相关:stackoverflow.com/questions/19877306/…
-
默认情况下,在 Python 3 中,所有字符串 都是 Unicode (UTF-8),因此
digits = 4 if isinstance(src, unicode) else 2变得毫无意义(即使它“有效”)。 Unicode 字形可能需要不同数量的字节来表示,具体取决于所使用的确切 Unicode 编码是什么。 -
这个answer 到另一个问题可能会有所帮助(尽管它是为 Python 2 编写的)。
-
Src 是从远程套接字对象接收到的数据。 hexdump 函数应该使用十六进制值和 ASCII 可打印字符输出数据包详细信息。因此,如果不需要数字变量,这是否意味着我不必在字符串格式化程序中使用星号?