Python 如何将字符串转换为二进制?

Python 如何将字符串转换为二进制?,python,string,binary,Python,String,Binary,我需要一种方法来获取python中字符串的二进制表示形式。e、 g st = "hello world" toBinary(st) 有没有一个简单的模块可以做到这一点?您可以使用ord()内置函数访问字符串中字符的代码值。如果需要将其格式化为二进制,则string.format()方法将完成此任务 a = "test" print(' '.join(format(ord(x), 'b') for x in a)) (感谢Ashwini Chaudhary发布了这段代码片段。) 虽然上面的代码

我需要一种方法来获取python中字符串的二进制表示形式。e、 g

st = "hello world"
toBinary(st)

有没有一个简单的模块可以做到这一点?

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

a = "test"
print(' '.join(format(ord(x), 'b') for x in a))
(感谢Ashwini Chaudhary发布了这段代码片段。)

虽然上面的代码在Python3中工作,但是如果假设使用UTF-8以外的任何编码,那么这个问题会变得更加复杂。在Python 2中,字符串是字节序列,默认情况下采用ASCII编码。在Python3中,字符串被假定为Unicode,并且有一个单独的
字节
类型,其作用更像Python2字符串。如果希望采用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字符集中不包含的字符,这一点将变得非常重要。

类似的内容

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

如果您所说的二进制是指
bytes
type,那么您可以使用字符串对象,该对象使用传递的编码类型将字符串编码为bytes对象。您只需要确保将正确的编码传递给
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
否则,如果您希望它们以零和一的形式(二进制表示法)表示,作为一种更具python风格的方式,您可以首先将字符串转换为字节数组,然后使用
map
中的
bin
函数:

>>> 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
将其转换为二进制。这是对已使用且无法再使用的现有答案的更新:

>>> st = "hello world"
>>> map(bin, bytearray(st))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding
>>st=“你好,世界”
>>>地图(垃圾箱,拜特雷(st))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:没有编码的字符串参数
因为,如上面链接中所述,如果源是字符串,则还必须给出编码:

>映射(bin,bytearray(st,encoding='utf-8'))

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

我们只需要对其进行编码

'string'.encode('ascii')

在Python版本3.6和更高版本中,可以使用来格式化结果

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为基数的结果数(二进制)


具体来说,您希望输出是什么?通过“二进制”,您是指0101010类型还是每个字符的
ord
inal编号(例如十六进制)?假设您实际上是指二进制(0和1),您希望每个字符的二进制表示(每个字符8位)一个接一个吗?e、 g.h是ascii值104在二进制中是01101000这个问题在stackoverflow上已经被回答了很多次:可能是重复的,或者如果你想让每个二进制数都是1字节:''。join(format(ord(i),'b')。zfill(8)表示st中的i)表示完整字节,你也可以使用
''。join('{0:08b}'。format(ord x),'b')表示st中的x)
,这比
zfill(8)
解决方案(至少在我的机器上)快约35%。如何转换多个字节的字符,如
β
,例如,在我看来,它在内部由
11001110 10110010
表示?我知道这是很久以前发布的,但是非ASCII字符呢?格式规范迷你语言:
'.join({:08b}).用字节数组('ß','utf-8')为d设置格式(d)
,输出:
'110000110011111'
,尝试其他编码
utf-16
utf-32
用于非ASCII。这不仅更像pythonic,而且更像“more”对于多字节非ASCII字符串正确。请注意(至少对于当前版本
3.7.4
):(1)
bytearray
需要编码(不仅仅是字符串)和(2)
map(bin,…)
将返回
map
对象。对于第一点,我使用@Tao建议的
bob
.encoding('ascii')`。对于第二点,使用
join
方法,就像在@Kasramvd的其他示例中一样,将显示所需的结果。“hello world.encode('ascii')是完美的。您想补充这个不可读的代码,只回答一些解释吗?这将有助于消除StackOverflow是免费代码编写服务的误解。如果您想提高可读性,请尝试此处提供的信息:对于我(
v3.7.4
),这将返回一个
bytes
对象(每个字节都有ascii表示,如果可用),为了显示其二进制表示,我需要
bin
,例如使用
'.join(项[2:]表示映射中的项(bin,'bob'。encode('ascii'))
(请注意,
0b
需要在每个字符的二进制表示的开头删除)。
'string'.encode('ascii')
str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
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))