将字符串打印为十六进制字节?

时间:2012-08-31 11:51:46

标签: python string hex ordinal-indicator

我有这个字符串:Hello world !!我想用Python 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21打印它。

hex()仅适用于整数。

怎么做?

15 个答案:

答案 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'