在python中将字符串转换为二进制

use*_*614 88 python string binary

我需要一种方法来获取python中字符串的二进制表示.例如

st = "hello world"
toBinary(st)
Run Code Online (Sandbox Code Playgroud)

有一个简洁的方法来做这个吗?

Ash*_*ary 103

像这样的东西?

>>> st = "hello world"
>>> ' '.join(format(ord(x), 'b') for x in st)
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'

#using `bytearray`
>>> ' '.join(format(x, 'b') for x in bytearray(st))
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果您希望每个二进制数为1个字节:''.join(格式(ord(i),'b').zfill(8)for i in st) (20认同)
  • 对于完整字节,你也可以使用`''.join('{0:08b}'.format(ord(x),'b')来表示st中的x),比`zfill快约35%( 8)`解决方案(至少在我的机器上). (5认同)
  • 我知道这是很久以前发布的,但是非 ASCII 字符呢? (2认同)
  • 有没有办法从字节数组重建原始字符串 one: 1101000 1100101 1101100 '? (2认同)

Kas*_*mvd 43

作为一种更加pythonic的方式,您可以先将字符串转换为字节数组,然后使用以下bin函数map:

>>> st = "hello world"
>>> map(bin,bytearray(st))
['0b1101000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1110111', '0b1101111', '0b1110010', '0b1101100', '0b1100100']
Run Code Online (Sandbox Code Playgroud)

或者你可以加入它:

>>> ' '.join(map(bin,bytearray(st)))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
Run Code Online (Sandbox Code Playgroud)

请注意,在python3中,您需要为bytearray函数指定编码:

>>> ' '.join(map(bin,bytearray(st,'utf8')))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
Run Code Online (Sandbox Code Playgroud)

你也可以binascii在python 2中使用模块:

>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'
Run Code Online (Sandbox Code Playgroud)

hexlify返回二进制数据的十六进制表示,然后您可以通过指定16作为其基础转换为int,然后将其转换为二进制bin.

  • 这不仅是pythonic,而且对于多字节非ASCII字符串来说这更"正确". (5认同)
  • 只是要注意(至少对于当前版本“3.7.4”):(1)“bytearray”需要编码(不仅仅是字符串),(2)“map(bin,...)”将返回`地图`对象。对于第一点,我按照 @Tao 的建议使用例如 `bob`.encoding('ascii')` 。对于第二个点,使用“join”方法,如 @Kasramvd 的其他示例中所示,将显示所需的结果。 (2认同)

小智 19

我们只需要对其进行编码.

'string'.encode('ascii')
Run Code Online (Sandbox Code Playgroud)


Mar*_*ins 15

您可以使用ord()内置函数访问字符串中字符的代码值.如果您需要将其格式化为二进制格式,则该string.format()方法将完成此任务.

a = "test"
print(' '.join(format(ord(x), 'b') for x in a))
Run Code Online (Sandbox Code Playgroud)

(感谢Ashwini Chaudhary发布该代码段.)

虽然上面的代码在Python 3中有效,但如果您假设除了UTF-8之外的任何编码,这个问题会变得更复杂.在Python 2中,字符串是字节序列,默认情况下采用ASCII编码.在Python 3中,字符串被假定为Unicode,并且有一个单独的bytes类型更像Python 2字符串.如果您希望采用UTF-8以外的任何编码,则需要指定编码.

在Python 3中,您可以执行以下操作:

a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))
Run Code Online (Sandbox Code Playgroud)

对于简单的字母数字字符串,UTF-8和ascii编码之间的差异并不明显,但如果您处理的文本包含不在ascii字符集中的字符,则会变得很重要.


Vla*_*den 5

在 Python 3.6 及更高版本中,您可以使用f-string来格式化结果。

str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
Run Code Online (Sandbox Code Playgroud)
  • 冒号的左侧 ord(i) 是实际对象,其值将被格式化并插入到输出中。使用 ord() 为您提供单个 str 字符的 base-10 代码点。

  • 冒号的右侧是格式说明符。08 表示宽度为 8,填充为 0,b 用作符号以输出基数为 2(二进制)的结果数。

  • 请注意,您正在覆盖“str” (2认同)