Python: 二进制/十六进制字符串转换?

17

我有一个字符串,其中既包含二进制字符又包含字符串字符,我希望先将其转换为二进制,然后再转换为十六进制。

字符串如下:

<81>^Q<81>"^Q^@^[)^G ^Q^A^S^A^V^@<83>^Cd<80><99>}^@N^@^@^A^@^@^@^@^@^@^@j

我该如何在Python中将这个字符串转换成十六进制格式,使输出结果类似于以下内容?

24208040901811001B12050809081223431235113245422F0A23000000000000000000001F

5
你能详细说明一下预期的翻译吗?在我看来,示例字符串和十六进制输出并不是同一件事...<81>是一个单独的、不可打印的十六进制编码字符,还是它是这个字符的文本表示?我对包含二进制字符的字符串感到困惑(你指的是什么),以及你想要将其转换为二进制,然后转换为十六进制... - Adriaan
请执行以下操作:print(repr(your_string))),并将结果复制/粘贴到您的问题中。告诉我们使用的Python版本和平台。 - John Machin
3个回答

29

你可以使用ord和hex来实现:

>>> s = 'some string'
>>> hex_chars = map(hex,map(ord,s))
>>> print hex_chars
['0x73', '0x6f', '0x6d', '0x65', '0x20', '0x73', '0x74', '0x72', '0x69', '0x6e', '0x67']
>>> hex_string = "".join(c[2:4] for c in hex_chars)
>>> print hex_string
736f6d6520737472696e67
>>>

或者使用内置的编码:

>>> s = 'some string'
>>> print s.encode('hex_codec')
736f6d6520737472696e67
>>>

2
你使用hexord的版本不可靠。使用"%2.2x".__mod__代替hex,你还可以避免使用c[2:4]。结果将会是:"".join(map("%2.2x".__mod__, map(ord, s)))。当然,编码版本更好。 :-) - Helmut Grohne

12
>>> import binascii

>>> s = '2F'

>>> hex_str = binascii.b2a_hex(s)

>>> hex_str

>>> '3246'

或者

>>>import binascii

>>> hex_str = binascii.hexlify(s)

>>> hex_str
>>> '3246'
>>>

1
更快的解决方案请参见:
from timeit import Timer

import os
import binascii

def testSpeed(statement, setup = 'pass'):
  print '%s' % statement
  print '%s' % Timer(statement, setup).timeit()

setup = """
import os

value = os.urandom(32)
"""

# winner
statement = """
import binascii

binascii.hexlify(value)
"""

testSpeed(statement, setup)

# loser
statement = """
import binascii

value.encode('hex_codec')
"""

testSpeed(statement, setup)

结果:

import binascii

binascii.hexlify(value)

2.18547999816

value.encode('hex_codec')

2.91231595077

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接