[英]Trying to convert a hexdump from Python2 to Python3
所以上個月我一直在學習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)
我有一些無法在線找到的問題。 如果是單個整數,為什么需要解壓數字? 等同於"%0*X" % (digits, ord(x))
是"{0:X}".format(*digits, ord(x))
嗎? 為什么有兩個理由呢? 我注意到在result.append()
中還有一個附加參數。 任何幫助將不勝感激。
這對我有用。 將xrange更改為range,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)
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))
這就是你所需要的。
這本書的功能是做不必要的事情,只是使您感到困惑。 不要猛烈抨擊這本書,但是那本書中的代碼有點糟糕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.