【问题标题】:How to convert an int to a hex string?如何将 int 转换为十六进制字符串?
【发布时间】:2011-01-17 05:02:06
【问题描述】:

我想将一个整数(即

例如:我想传入65 并退出'\x41',或者255 并得到'\xff'

我已经尝试使用struct.pack('c',65) 执行此操作,但由于它想要接收单个字符串,因此会阻塞9 以上的任何内容。

【问题讨论】:

    标签: python string hex int


    【解决方案1】:

    您正在寻找chr 函数。

    您似乎混合了整数的十进制表示和整数的十六进制表示,因此您需要什么并不完全清楚。根据您提供的描述,我认为其中一个 sn-ps 显示了您想要的内容。

    >>> chr(0x65) == '\x65'
    True
    
    
    >>> hex(65)
    '0x41'
    >>> chr(65) == '\x41'
    True
    

    请注意,这与包含一个十六进制整数的字符串完全不同。如果这是您想要的,请使用 hex 内置函数。

    【讨论】:

    • 我认为 chr 将整数转换为 ascii。在这种情况下,chr(65) = 'A'。这是新增功能吗?
    • @diedthreetimes, chr 根本不涉及 ASCII——它只需要一个数字并生成一个单字节的字节串,其中字节的序数值是数字。当您编写和显示字节串时,ASCII 和 ASCII 兼容的编码就会发挥作用。
    • @diedthreetimes,例如,他们通过使'A' 成为另一种写入和显示'\x41' 的方式进入。所有str 真正关心的是这是六十五岁的事实。为了使事物可以被人类理解和使用,它通常变成 A。
    【解决方案2】:

    试试:

    "0x%x" % 255 # => 0xff
    

    "0x%X" % 255 # => 0xFF
    

    Python 文档说:“把它放在你的枕头下:http://docs.python.org/library/index.html

    【讨论】:

    • "%#x" % 255 :)
    【解决方案3】:

    hex() 呢?

    hex(255)  # 0xff
    

    如果你真的想在前面有\,你可以这样做:

    print '\\' + hex(255)[1:]
    

    【讨论】:

    • repr(chr(255)) # '\xff' 也实现了这一点
    【解决方案4】:

    这会将整数转换为带有 0x 前缀的 2 位十六进制字符串:

    strHex = "0x%0.2X" % 255
    

    【讨论】:

    • 我建议在这里编辑代码并将其更改为:strHex = "0x%0.2X" % integerVariable. (我无法自己编辑。)
    【解决方案5】:

    如果您想打包一个值 format B instead of c。 C 将字符转换为字符串(本身不太有用),而 B 将整数转换。

    struct.pack('B', 65)
    

    (是的,65 是 \x41,而不是 \x65。)

    结构类还可以方便地处理字节序以进行通信或其他用途。

    【讨论】:

    • 我找到 struct.pack('B', ) 所花费的时间是惊人的。谢谢。
    【解决方案6】:

    我想将一个随机整数转换成一个以#开头的六位十六进制字符串。为了得到这个,我使用了

    "#%6x" % random.randint(0xFFFFFF)
    

    【讨论】:

    • 我想你的意思是"#%6x" % random.randint(0x0, 0xFFFFFF)。 (在6randint 之前缺少% 需要2 个参数-下界和上界-)
    • 如果你不想要空格,应该是 %06x
    【解决方案7】:

    请注意,对于较大的值,hex() 仍然有效(其他一些答案无效):

    x = hex(349593196107334030177678842158399357)
    print(x)
    

    Python 2:0x4354467b746f6f5f736d616c6c3f7dL
    Python 3:0x4354467b746f6f5f736d616c6c3f7d

    对于解密的 RSA 消息,可以执行以下操作:

    import binascii
    
    hexadecimals = hex(349593196107334030177678842158399357)
    
    print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
    print(binascii.unhexlify(hexadecimals[2:])) # python 3
    

    【讨论】:

    • 嗯...不。我尝试了hex(hash(text)),它产生了一个负整数,导致一个带有减号的十六进制字符串。是谁实施的?
    • @JPT 我不明白你的问题。如果该值为负数,则显然十六进制值将带有减号。为什么在以十六进制、二进制、十进制或任何其他数字系统编写时会有所不同?或者您是否正在寻找内存中的表示,其中有一个位通过设置或取消设置来确定符号?
    • 嗯,计算机科学家期望负十六进制是以符号标志开头的东西,例如 FFFx xxxx 或 8000 xxxx,而不是实际符号。我以前从未见过带有减号的十六进制。但如果你这样说的话...... ;)
    【解决方案8】:

    这对我来说效果最好

    "0x%02X" % 5  # => 0x05
    "0x%02X" % 17 # => 0x11
    

    如果您想要一个宽度更大的数字(2 代表 2 个十六进制打印字符),请更改 (2),这样 3 将为您提供以下内容

    "0x%03X" % 5  # => 0x005
    "0x%03X" % 17 # => 0x011
    

    【讨论】:

      【解决方案9】:

      您可以使用另一种表示方式

      [in] '%s' % hex(15)
      [out]'0xf'
      

      【讨论】:

        【解决方案10】:

        让我添加这个,因为有时您只需要单个数字表示

        x 可以是小写,'x',也可以是大写,'X',选择决定了输出字母是大写还是小写。)

        '{:x}'.format(15)
        > f
        

        现在你可以使用新的f'' 格式字符串:

        f'{15:x}'
        > f
        

        要添加 0 填充,您可以使用 0>n:

        f'{2034:0>4X}'
        > 07F2
        

        注意:f'{15:x}' 中的初始 'f' 表示格式字符串

        【讨论】:

        • 有关此简洁功能的参考,PEP 498 -- Literal String Interpolation
        • 恕我直言,更“可读”的选项可以是 '0x{:X}'.format(15) (注意 X 是大写的)。对于 2034 年,它将打印 0x7F2 而不是 7f2
        【解决方案11】:

        使用format(),按照format-examples,我们可以这样做:

        >>> # format also supports binary numbers
        >>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
        'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
        >>> # with 0x, 0o, or 0b as prefix:
        >>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
        'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'
        

        【讨论】:

          【解决方案12】:
          (int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()
          

          例如:

          >>> (434).to_bytes(4, byteorder='big').hex()
          '000001b2'
          >>> (434).to_bytes(4, byteorder='little').hex()
          'b2010000'
          

          【讨论】:

            【解决方案13】:

            您还可以将任何基数的任何数字转换为十六进制。在这里使用这一行代码很容易使用:

            hex(int(n,x)).replace("0x","")

            您有一个字符串 n 是您的号码,x 是该号码的基数。首先,将其更改为整数,然后更改为十六进制,但十六进制的第一个有0x,所以我们将replace 删除。

            【讨论】:

            • hex(int(n,x))[2:] - 不确定哪个更快:)
            猜你喜欢
            • 1970-01-01
            • 2013-02-07
            • 2020-12-09
            • 2020-07-18
            • 1970-01-01
            相关资源
            最近更新 更多