【问题标题】:Trying to convert a hexdump from Python2 to Python3尝试将 hexdump 从 Python2 转换为 Python3
【发布时间】: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 可打印字符输出数据包详细信息。因此,如果不需要数字变量,这是否意味着我不必在字符串格式化程序中使用星号?

标签: python hexdump


【解决方案1】:

这对我有用。将 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)

【讨论】:

    【解决方案2】:
    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))
    

    这就是你需要的。

    书中的功能是做一些不必要的事情来迷惑你。 不要抨击这本书,但那本书中的代码有点糟糕。

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 2022-08-05
      • 1970-01-01
      • 2017-01-24
      • 2018-05-30
      • 2020-10-11
      • 2019-06-06
      • 1970-01-01
      • 2021-07-10
      相关资源
      最近更新 更多