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

时间:2013-09-15 18:19:16

标签: python string binary

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

st = "hello world"
toBinary(st)

有没有一个巧妙的方法模块呢?

7 个答案:

答案 0 :(得分:92)

这样的东西?

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

答案 1 :(得分:37)

作为一种更加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 中,您需要为bytearray函数指定编码:

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

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

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

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

答案 2 :(得分:15)

您可以使用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字符集中,则会变得很重要。

答案 3 :(得分:13)

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

'string'.encode('ascii')

答案 4 :(得分:0)

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转换为字节数组的效率更高,因为它进行低级函数调用,而不是手动将每个字符转换为整数,然后将该整数转换为其二进制值。

答案 5 :(得分:0)

在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字符的基数为10的代码点。

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

答案 6 :(得分:-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))