我有这个字符串:Hello world !!
我想用Python 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21
打印它。
hex()
仅适用于整数。
怎么做?
答案 0 :(得分:208)
您可以将字符串转换为int生成器,为每个元素应用十六进制格式并插入分隔符:
>>> 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
答案 1 :(得分:157)
':'.join(x.encode('hex') for x in 'Hello World!')
答案 2 :(得分:53)
对于Python 2.x:
':'.join(x.encode('hex') for x in 'Hello World!')
上面的代码不适用于Python 3.x ,对于3.x,以下代码可以使用:
':'.join(hex(ord(x))[2:] for x in 'Hello World!')
答案 3 :(得分:20)
另外两行答案中有些人可能会更容易阅读,并有助于调试字符串中的换行符或其他奇怪字符:
for character in string:
print character, character.encode('hex')
答案 4 :(得分:19)
Fedor Gogolev的一些补充回答:
首先,如果字符串包含“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'
^^
其次,如果您的“字符串”实际上是“字节字符串” - 并且由于差异在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'
请注意,上述代码中不需要将a bytes objects is defined转换为“0 <= x <256”范围内的不可变整数序列。
答案 5 :(得分:10)
将字符串打印为十六进制字节?
接受的答案给出了:
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.
你需要以某种方式转换为字节。
如果您的终端不接受这些字符,您可以从UTF-8解码或使用名称(这样您就可以粘贴并运行代码):
a_string = (
"\N{CYRILLIC CAPITAL LETTER PE}"
"\N{CYRILLIC SMALL LETTER ER}"
"\N{CYRILLIC SMALL LETTER I}"
"\N{CYRILLIC SMALL LETTER VE}"
"\N{CYRILLIC SMALL LETTER IE}"
"\N{CYRILLIC SMALL LETTER TE}"
"\N{SPACE}"
"\N{CYRILLIC SMALL LETTER EM}"
"\N{CYRILLIC SMALL LETTER I}"
"\N{CYRILLIC SMALL LETTER ER}"
"\N{EXCLAMATION MARK}"
"\N{EXCLAMATION MARK}"
)
所以我们看到了:
":".join("{:02x}".format(ord(c)) for c in a_string)
返回
'41f:440:438:432:435:442:20:43c:438:440:21:21'
一个糟糕/意想不到的结果 - 这些是代码点结合起来,使我们在Unicode中看到的字形来自Unicode Consortium - 代表全世界的语言。这是不我们如何实际存储这些信息,所以它可以被其他来源解释。
要允许其他来源使用此数据,我们通常需要转换为UTF-8编码,例如,将此字符串以字节为单位保存到磁盘或发布到html。因此我们需要使用该编码将代码点转换为UTF-8的代码单元 - 在Python 3中,不需要ord
,因为bytes
是整数的可迭代:< / p>
>>> ":".join("{:02x}".format(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'
或者更优雅的是,使用新的f-strings(仅在Python 3中可用):
>>> ":".join(f'{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'
在Python 2中,首先将c
传递给ord
,即ord(c)
- 更多示例:
>>> ":".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'
>>> ":".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'
答案 6 :(得分:7)
您可以使用hexdump
的
import hexdump
hexdump.dump("Hello World", sep=":")
(如果您需要小写,请附加.lower()
)。这适用于Python 2&amp; 3。
答案 7 :(得分:7)
使用map和lambda函数可以生成一个十六进制值列表,可以打印(或用于其他目的)
function add(){
"use strict";
num1 = parseInt(document.getElementById("firstNumber")).value;
num2 = parseInt(document.getElementById("secondNumber")).value;
parseInt(document.getElementById("result")).innerHTML =num1+num2;
}
答案 8 :(得分:2)
这可以通过以下方式完成:
from __future__ import print_function
str = "Hello World !!"
for char in str:
mm = int(char.encode('hex'), 16)
print(hex(mm), sep=':', end=' ' )
这个输出将以十六进制表示如下:
0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64 0x20 0x21 0x21
答案 9 :(得分:2)
对于那些不关心Python3或冒号的人来说,更为通用:
from codecs import encode
data = open('/dev/urandom', 'rb').read(20)
print(encode(data, 'hex')) # data
print(encode(b"hello", 'hex')) # string
答案 10 :(得分:1)
为方便起见,非常简单。
def hexlify_byteString(byteString, delim="%"):
''' very simple way to hexlify a bytestring using delimiters '''
retval = ""
for intval in byteString:
retval += ( '0123456789ABCDEF'[int(intval / 16)])
retval += ( '0123456789ABCDEF'[int(intval % 16)])
retval += delim
return( retval[:-1])
hexlify_byteString(b'Hello World!', ":")
# Out[439]: '48:65:6C:6C:6F:20:57:6F:72:6C:64:21'
答案 11 :(得分:1)
在Python 3中:
":".join(c.encode().hex() for c in "Hello world !!")
# 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21
这类似于@Aesthete的答案。
答案 12 :(得分:0)
在 python2 (内置)中使用base64.b16encode
>>> s = 'Hello world !!'
>>> h = base64.b16encode(s)
>>> ':'.join([h[i:i+2] for i in xrange(0, len(h), 2)]
'48:65:6C:6C:6F:20:77:6F:72:6C:64:20:21:21'
答案 13 :(得分:0)
对于性能比reg <- c()
for(i in 1:(ncol(df)-1)) {
reg$i <- nlsLM(df[[i+1]]~SSfpl(time, a, b, c, d), df)
summary(reg)
}
Error in tapply(y, x, mean, na.rm = TRUE) :
arguments must have same length
高的东西,可以使用以下方法:
''.format()
对不起,这看起来不太好
如果一个人可以简单地做>>> ':'.join( '%02x'%(v if type(v) is int else ord(v)) for v in 'Hello World !!' )
'48:65:6C:6C:6F:20:77:6F:72:6C:64:20:21:21'
>>>
>>> ':'.join( '%02x'%(v if type(v) is int else ord(v)) for v in b'Hello World !!' )
'48:65:6C:6C:6F:20:77:6F:72:6C:64:20:21:21'
>>>
就好了,但这只需要整数...
但是您会陷入字节串'%02x'%v
的困境,而无法选择b''
。
答案 14 :(得分:0)
使用 f 字符串:
"".join(f"{ord(c):x}" for c in "Hello")
使用任何分隔符:
>>> "⚡".join(f"{ord(c):x}" for c in "Hello")
'48⚡65⚡6c⚡6c⚡6f'