我正在尝试找到一种以十六进制打印字符串的方法。例如,我有这个字符串,然后将其转换为其十六进制值。
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
,而且也不会用零填充。
你的意思是你在 my_hex
中有一个
bytes的字符串,你想将其打印为十六进制数字,对吗?例如,让我们以您的例子为例:
>>> 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
稍后打印/格式样式的另一个答案是:
res[0]=12
res[1]=23
print("my num is 0x{0:02x}{1:02x}".format(res[0],res[1]))
将字符串转换为以 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
>>>
使用
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
作为变量名,即使作为示例变量名也是非常糟糕的做法。
我想你可以尝试这样的事情:
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
如果您的输入字符串不是有效的十六进制字符对,这种方法将会失败......:
>>> import binascii
>>> ' '.join(hex(ord(i)) for i in binascii.unhexlify('deadbeef'))
'0xde 0xad 0xbe 0xef'
你可以写:
`def generate_payload():
payload="\xde\xad\xbe\xef"
print(len(payload))
return payload
if __name__ == "__main__":
payload = generate_payload()
print("Payload (représentation des caractères):")
print(repr(payload))
# Afficher le payload en hexadécimal
print("\nPayload (hexadécimal):")
print(' '.join(f'{ord(c):02x}' for c in payload))
`
功能
repr
正确显示十六进制字符
它返回带引号的字符串