以hex字节打印string?

我有这个string: Hello world !! 我想用Python打印48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21

hex()只适用于整数。

如何做呢?

你可以将你的string转换为一个int生成器,对每个元素应用hex格式,并插入分隔符:

 >>> s = "Hello world !!" >>> ":".join("{:02x}".format(ord(c)) for c in s) '48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 
 ':'.join(x.encode('hex') for x in 'Hello World!') 

对于Python 2.x:

 ':'.join(x.encode('hex') for x in 'Hello World!') 

上面的代码将不适用于3.x的Python 3.x ,下面的代码将工作:

 ':'.join(hex(ord(x))[2:] for x in 'Hello World!') 

Fedor Gogolev的一些补充答案:

首先,如果string包含“ASCII码”低于10的字符,则不会按要求显示。 在这种情况下,正确的格式应该是{:02x}

 >>> s = "Hello unicode \u0005 !!" >>> ":".join("{0:x}".format(ord(c)) for c in s) '48:65:6c:6c:6f:20:75:6e:69:63:6f:64:65:20:5:20:21:21' ^ >>> ":".join("{:02x}".format(ord(c)) for c in s) '48:65:6c:6c:6f:20:75:6e:69:63:6f:64:65:20:05:20:21:21' ^^ 

其次,如果你的“string”实际上是一个“字节string” – 而且由于Python 3中的差异很大 – 你可能更喜欢以下内容:

 >>> s = b"Hello bytes \x05 !!" >>> ":".join("{:02x}".format(c) for c in s) '48:65:6c:6c:6f:20:62:79:74:65:73:20:05:20:21:21' 

请注意,在上面的代码中不需要转换,因为字节对象被定义为“在0 <= x <256范围内的不可变整数序列”

在两行中的另一个答案,有些人可能会发现更容易阅读,并帮助debugging换行符或string中的其他奇怪的字符:

 for character in string: print character, character.encode('hex') 

你可以使用hexdump

 import hexdump hexdump.dump("Hello World", sep=":") 

(如果需要小写,则追加.lower() )。 这适用于Python 2和Python 3。

以hex字节打印string?

接受的答案是:

 >>> s = "Hello world !!" >>> ":".join("{:02x}".format(ord(c)) for c in s) '48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21 

被接受的答案只有在你坚持ascii的情况下才有效。 如果你使用unicode,例如:

 >>> a_string = u"Привет мир!!" # "Prevyet mir, or "Hello World" in Russian. >>> ":".join("{:02x}".format(ord(c)) for c in a_string) '41f:440:438:432:435:442:20:43c:438:440:21:21' 

我们得到了一个糟糕的/意外的结果 – 这些代码点结合起来,形成我们在unicode中看到的字形 ,来自unicode联盟 – 代表世界各地的语言。 但这并不是我们实际存储这些信息的方式,所以可以通过其他来源来解释。

为了允许另一个源使用这个数据,我们通常需要转换为utf-8编码,例如,把这个string保存到磁盘或者发布到html。 所以我们需要这种编码来将代码点转换为utf-8的代码单元

 >>> ":".join("{:02x}".format(ord(c)) for c in a_string.encode('utf-8')) 'd0:9f:d1:80:d0:b8:d0:b2:d0:b5:d1:82:20:d0:bc:d0:b8:d1:80:21:21' 

或者也许更优雅,只需使用内置format函数:

 >>> ":".join(format(ord(c), '02x') for c in a_string.encode('utf-8')) 'd0:9f:d1:80:d0:b8:d0:b2:d0:b5:d1:82:20:d0:bc:d0:b8:d1:80:21:21' 

使用map和lambda函数可以生成一个hex值列表,可以打印(或用于其他目的)

 >>> s = 'Hello 1 2 3 \x01\x02\x03 :)' >>> map(lambda c: hex(ord(c)), s) ['0x48', '0x65', '0x6c', '0x6c', '0x6f', '0x20', '0x31', '0x20', '0x32', '0x20', '0x33', '0x20', '0x1', '0x2', '0x3', '0x20', '0x3a', '0x29'] 

这可以通过以下方式完成:

 from __future__ import print_function str = "Hello World !!" for char in str: mm = int(char.encode('hex'), 16) print(hex(mm), sep=':', end=' ' ) 

这个输出将在hex如下:

0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64 0x20 0x21 0x21

Interesting Posts