20

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

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

如何打印my_hex0xde 0xad 0xbe 0xef

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

4

6 回答 6

25

你的意思是你有一个字节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()格式化 from 中的每个整数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
于 2013-05-15T18:26:49.603 回答
8

将字符串转换为以 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
>>> 
于 2013-05-15T18:09:39.893 回答
7

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

res[0]=12
res[1]=23
print("my num is 0x{0:02x}{1:02x}".format(res[0],res[1]))
于 2017-05-28T15:45:59.290 回答
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即使作为示例变量名,也将其用作变量名是非常糟糕的做法。

于 2013-05-15T18:06:04.470 回答
1

我猜你可以尝试这样的事情:

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
于 2013-05-15T18:13:25.093 回答
1

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

>>> import binascii
>>> ' '.join(hex(ord(i)) for i in binascii.unhexlify('deadbeef'))
'0xde 0xad 0xbe 0xef'
于 2013-05-15T18:27:28.957 回答