簡體   English   中英

嘗試將十六進制轉儲從Python2轉換為Python3

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM