143

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

st = "hello world"
toBinary(st)

是否有一些巧妙的方式来做到这一点?

4

8 回答 8

151

像这样的东西?

>>> 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, 'utf-8'))
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
于 2013-09-15T18:24:53.633 回答
84

如果二进制是指bytes类型,则可以使用字符串对象的encode方法,该方法使用传递的编码类型将字符串编码为字节对象。您只需要确保传递正确的编码即可encode运行。

In [9]: "hello world".encode('ascii')                                                                                                                                                                       
Out[9]: b'hello world'

In [10]: byte_obj = "hello world".encode('ascii')                                                                                                                                                           

In [11]: byte_obj                                                                                                                                                                                           
Out[11]: b'hello world'

In [12]: byte_obj[0]                                                                                                                                                                                        
Out[12]: 104

否则,如果您希望它们以零和一的形式——二进制表示——作为一种更 Pythonic 的方式,您可以首先将字符串转换为字节数组,然后使用以下bin函数map

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

或者你可以加入它:

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

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

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

您还可以binascii在 python 2 中使用模块:

>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'

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

于 2015-06-04T10:58:12.177 回答
48

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

'string'.encode('ascii')
于 2018-10-11T13:51:10.430 回答
16

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

a = "test"
print(' '.join(format(ord(x), 'b') for x in a))

(感谢 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]))

UTF-8 和 ascii 编码之间的区别对于简单的字母数字字符串来说并不明显,但如果您正在处理包含不在 ascii 字符集中的字符的文本,则将变得很重要。

于 2013-09-15T18:23:50.270 回答
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
  • 冒号左侧 ord(i) 是实际对象,其值将被格式化并插入到输出中。使用 ord() 为您提供单个 str 字符的 base-10 代码点。

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

于 2019-06-20T19:23:44.363 回答
2
def method_a(sample_string):
    binary = ' '.join(format(ord(x), 'b') for x in sample_string)

def method_b(sample_string):
    binary = ' '.join(map(bin,bytearray(sample_string,encoding='utf-8')))


if __name__ == '__main__':

    from timeit import timeit

    sample_string = 'Convert this ascii strong to binary.'

    print(
        timeit(f'method_a("{sample_string}")',setup='from __main__ import method_a'),
        timeit(f'method_b("{sample_string}")',setup='from __main__ import method_b')
    )

# 9.564299999998184 2.943955828988692

method_b 在转换为字节数组时效率更高,因为它进行低级函数调用,而不是手动将每个字符转换为整数,然后将该整数转换为其二进制值。

于 2018-07-31T13:31:32.647 回答
1

这是对现有答案的更新,这些答案已使用bytearray()且无法再以这种方式工作:

>>> st = "hello world"
>>> map(bin, bytearray(st))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding

因为,如上面链接中所述,如果源是字符串,则 还必须提供编码

>>> map(bin, bytearray(st, encoding='utf-8'))
<map object at 0x7f14dfb1ff28>
于 2018-05-11T11:13:02.327 回答
-1
a = list(input("Enter a string\t: "))
def fun(a):
    c =' '.join(['0'*(8-len(bin(ord(i))[2:]))+(bin(ord(i))[2:]) for i in a])
    return c
print(fun(a))
于 2019-07-30T18:34:03.037 回答