【问题标题】:Print a variable in hexadecimal in Python在 Python 中以十六进制打印变量
【发布时间】:2013-05-10 10:27:29
【问题描述】:

我正在尝试找到一种以十六进制打印字符串的方法。例如,我有这个字符串,然后我将其转换为它的十六进制值。

my_string = "deadbeef"
my_hex = my_string.decode('hex')

如何将my_hex 打印为0xde 0xad 0xbe 0xef

为了让我的问题更清楚......假设我有一些像0x01, 0x02, 0x03, 0x04 这样的数据存储在一个变量中。现在我需要以十六进制打印它以便我可以阅读它。我想我正在寻找与 printf("%02x", my_hex) 等效的 Python。我知道有print '{0:x}'.format(),但这不适用于my_hex,它也不会用零填充。

【问题讨论】:

标签: python string hex


【解决方案1】:

使用

print " ".join("0x%s"%my_string[i:i+2] for i in range(0, len(my_string), 2))

像这样:

>>> my_string = "deadbeef"
>>> print " ".join("0x%s"%my_string[i:i+2] for i in range(0, len(my_string), 2))
0xde 0xad 0xbe 0xef
>>>

在不相关的旁注中...使用string 作为变量名,即使作为示例变量名也是非常糟糕的做法。

【讨论】:

  • 这看起来像是将字符串拆分成字符对。我不需要那个。
  • +1 用于调用使用string 作为变量名。用变量覆盖基类型会导致令人难以置信的令人沮丧的调试,相信我。
  • @Valdogg21: string 不是基本类型——那是str。然而,它是一个标准库模块的名称。
  • @DSM 哎呀。重要的时刻。
【解决方案2】:

将字符串转换为以 16 为底的整数,然后转换为十六进制。

print hex(int(string, base=16))

这些是内置函数。

http://docs.python.org/2/library/functions.html#int

例子

>>> string = 'AA'
>>> _int = int(string, base=16)
>>> _hex = hex(_int)
>>> print _int
170
>>> print _hex
0xaa
>>> 

【讨论】:

    【解决方案3】:

    我猜你可以试试这样的:

    new_str = ""
    str_value = "rojbasr"
    for i in str_value:
        new_str += "0x%s " % (i.encode('hex'))
    print new_str
    

    你的输出会是这样的:

    0x72 0x6f 0x6a 0x62 0x61 0x73 0x72
    

    【讨论】:

    • 我虽然他想把一个字符串翻译成十六进制,而不是把它分成两对 2 。我没有看到示例输出是我的错
    • 不是您的错,如果您查看历史记录,您会发现原来的问题是这样写的。 OP 无法决定为他/她的变量命名什么,但我想我为他/她修复了它......
    【解决方案4】:

    您的意思是您在my_hex 中有一个字节 字符串,您想将其打印为十六进制数字,对吧?例如,让我们举个例子:

    >>> my_string = "deadbeef"
    >>> my_hex = my_string.decode('hex')  # python 2 only
    >>> print my_hex
    Þ ­ ¾ ï
    

    此构造仅适用于 Python 2;但是您可以在 Python 2 或 Python 3 中编写与文字相同的字符串,如下所示:

    my_hex = "\xde\xad\xbe\xef"
    

    所以,回答。这是将字节打印为十六进制整数的一种方法:

    >>> print " ".join(hex(ord(n)) for n in my_hex)
    0xde 0xad 0xbe 0xef
    

    理解将字符串分解为字节,ord() 将每个字节转换为相应的整数,hex() 格式化来自0x## 中的每个整数。然后我们在中间添加空格。

    奖励:如果您将此方法与 unicode 字符串(或 Python 3 字符串)一起使用,则理解将为您提供 unicode 字符(而不是字节),即使它们大于两位数,您也会得到适当的十六进制值.

    附录:字节串

    在 Python 3 中,您更有可能希望使用字节字符串来执行此操作;在这种情况下,理解已经返回整数,因此您必须省略 ord() 部分,只需在它们上调用 hex()

    >>> my_hex = b'\xde\xad\xbe\xef'
    >>> print(" ".join(hex(n) for n in my_hex))
    0xde 0xad 0xbe 0xef
    

    【讨论】:

    • 请注意这不适用于 Python 3.x,而 unhexlifysolution 将...
    • @alexis the .decode as str 不再有 decode,因为它没有必要....并且b'deadbeef'.decode('hex') 将无法工作,因为hex 编码已被删除
    • 但这就是 OP 构造字符串的方式:它不是答案的一部分。 hex(ord(c)) 仍会将一个字节转换为两位十六进制数。
    【解决方案5】:

    如果您的输入字符串不是有效的十六进制字符对,则会失败的方法...:

    >>> import binascii
    >>> ' '.join(hex(ord(i)) for i in binascii.unhexlify('deadbeef'))
    '0xde 0xad 0xbe 0xef'
    

    【讨论】:

      【解决方案6】:

      稍后打印/格式样式的另一个答案是:

      res[0]=12
      res[1]=23
      print("my num is 0x{0:02x}{1:02x}".format(res[0],res[1]))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 2015-02-14
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多