如何在python中将位转换为字节?

时间:2019-05-19 01:07:52

标签: python

我正在使用以下代码将字符转换为位,并且我不知道如何将位转换回其字符。

我尝试按照我所采取的步骤来撤消该过程。我知道ord()的反义词是chr(),但是如何反转format(ord(char),“ b”)? 任何帮助表示赞赏

temp = format(ord(char), 'b')

3 个答案:

答案 0 :(得分:3)

您可以使用int()将字符串转换为整数,并以2为基数,然后使用chr()转换为字符:

temp = format(ord('a'), 'b')
print(temp)
#'1100001'

c = chr(int(temp, 2))
print(c)
# 'a'

答案 1 :(得分:2)

马克·迈耶的答案很明确,并且适​​用于任何字符

>>> char = ''
>>> bits = format(ord(char), 'b')
>>> bits
'11111011000001110'
>>> char = chr(int(bits, 2))
>>> char
''

但是它仅适用于字符,不适用于字素簇。假设您有女科学家表情符号:

>>> char = '‍'
>>> bits = format(ord(char), 'b')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 3 found

这不起作用,因为女科学家表情符号不是单个字符,而是由三个字符组成的字素簇:

  • 女人
  • 零宽Joiner
  • 显微镜

因此该字符串包含三个字符,您不能对三个字符串执行ord

我认为重要的是,在此处不要将单个字符转换为其代码点的位字符串非常不寻常,并且在实践中,这绝不会真正完成(除非您使用的是称为UTF-32 BE的编码,如果您应该用零填充位串到32位)。恕我直言,您在这里应该做的不是使用ordchr,而是使用UTF-8进行编码和解码。将字符转换为位或字节的想法应该使用众所周知的字符编码方案来完成,而UTF-8是最合适的。

这是我建议您做的角色和角色:

>>> char = '‍'
>>> bytes = char.encode('utf-8')
>>> bytes
b'\xf0\x9f\x91\xa9\xe2\x80\x8d\xf0\x9f\x94\xac'
>>> char = bytes.decode('utf-8')
>>> char
'‍'

如果要位而不是字节,则:

>>> char = '‍'
>>> bytes = char.encode('utf-8')
>>> bits = ''.join(f'{b:08b}' for b in bytes)
>>> bits
'1111000010011111100100011010100111100010100000001000110111110000100111111001010010101100'

答案 2 :(得分:0)

使用Python 3.6+ f字符串往返位:

>>> char = 'a'
>>> bits = f'{ord(char):08b}'  # 08b means 8 binary digits with leading zeros.
>>> bits
'01100001'
>>> chr(int(bits,2)) # convert string to integer using base 2.
'a'