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

2025-01-20 09:06:00
admin
原创
115
摘要:问题描述:我需要一种方法来获取 python 中字符串的二进制表示形式。例如st = "hello world" toBinary(st) 是否有一个模块可以巧妙地实现这一目标?解决方案 1:像这样吗?>>> st = "hello world" &g...

问题描述:

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

st = "hello world"
toBinary(st)

是否有一个模块可以巧妙地实现这一目标?


解决方案 1:

像这样吗?

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

解决方案 2:

如果您指的是二进制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

否则,如果您希望它们以零和一的形式(二进制表示)表示,作为更符合 Python 的方式,您可以先将字符串转换为字节数组,然后使用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'

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

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

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

解决方案 3:

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

'string'.encode('ascii')

解决方案 4:

您可以使用内置函数访问字符串中字符的代码值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 字符集中的字符,则差异将变得很重要。

解决方案 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 字符的十进制代码点。

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

解决方案 6:

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

解决方案 7:

这是对现有答案的更新,这些答案过去使用过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>

解决方案 8:

''.join(format(i, 'b') for i in bytearray(str, encoding='utf-8'))

这没问题,因为现在很容易恢复回字符串,因为不会添加零来达到 8 位来形成一个字节,因此很容易恢复回字符串以避免删除添加的零的复杂性。

解决方案 9:

以下是ASCII 127(删除)各种编码的位长度比较。请注意UTF-8-SIG、UTF-16 和 UTF-32 中各自的 24、16 和 32 位字节顺序标记 (BOM) :

>>> for encoding in ('utf-8', 'utf-8-sig', 'utf-16', 'utf-16-le', 'utf-16-be', 'utf-32', 'utf-32-le', 'utf-32-be'): print(''.join(' '.join((f'{encoding:9}', f'{len(bs):2}', bs)) for bs in [''.join(f'{byte:08b}' for byte in 'x7f'.encode(encoding))]))
...
utf-8      8 01111111
utf-8-sig 32 11101111101110111011111101111111
utf-16    32 11111111111111100111111100000000
utf-16-le 16 0111111100000000
utf-16-be 16 0000000001111111
utf-32    64 1111111111111110000000000000000001111111000000000000000000000000
utf-32-le 32 01111111000000000000000000000000
utf-32-be 32 00000000000000000000000001111111

解决方案 10:

a = list(input("Enter a string    : "))
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))
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用