二进制字符串用于以字节形式存储数据。字节是计算机编程中的一个单位,由 8 位组成。字节用于存储许多数据格式,例如音频文件、视频文件和图像。
二进制字符串仅由 0 和 1 组成。它是一系列具有特定含义的 0 和 1。
普通字符串也称为字符串,可以包含序列中的所有数字、字母和符号。该序列可以具有人类可以理解的含义。
而二进制数据纯粹是为计算机解释而设计的。
二进制字符串用于执行按位运算等低级运算,而字符串用于执行文本处理甚至自然语言处理等高级处理任务。
相关:阅读有关如何将字节转换为 Unicode 的类似文章。
字符串需要指定编码格式才能在不同格式之间互换。
在这篇文章中,我们将重点讨论如何创建二进制字符串,并了解将二进制字符串转换为普通字符串的不同可能性。
什么是二进制字符串?
如上所述,二进制字符串以零和一的形式存储信息,因为计算机无法理解我们说或写的正常语言。因此,有很多方法可以将人类语言转换为机器可以理解的低级语言。
在 Python 中创建二进制字符串有几种方法。
在我们开始举例之前,我们需要澄清一些事情。在Python中,每当我们尝试表示一个二进制字符串时,总会有一个称为前缀的前缀,0b
用来表示它是一个二进制数。
大多数时候,当我们尝试将二进制字符串转换为字符串或反之亦然时,我们会尝试消除此前缀。
使用 bin() 函数
bin() 函数是一个内置的 Python 函数,用于获取整数的二进制表示形式。
1
2
3
4
|
num = 74 print ( "The number is:" ,num) x = bin (num) print ( "The binary representation of " ,num, "is:" ,x) |
在此代码中,我们将值 74 赋给变量 num。我们需要用二进制格式表示 74。在下一行中,我们将打印数字。
接下来,我们使用 bin 函数并将num
变量作为参数传递。结果存储在 x 中。
二进制表示形式打印在下一行中。
如上所述,0b
前缀包含在二进制字符串之前。有一种方法可以删除前缀。
1
2
3
4
5
6
|
num = 74 print ( "The number is:" ,num) x = bin (num)[ 2 :] print ( "The binary representation of " ,num, "is:" ,x) print ( type (num)) print ( type (x)) |
这段代码和上面的代码是一样的。但是,我们在第 3 行中使用了切片运算符 (:) 来删除0b
前缀。由于 Python 中索引从零开始,因此 0 和 b 分别具有位置 0 和 1。因此,我们尝试从第二个位置开始打印 x 变量的内容。
最后两行还分别打印 num 和 x 的类型。
将字符串转换为二进制字符串
我们已经了解了如何将整数转换为二进制字符串。现在让我们获取一个字符串并将其转换为二进制字符串。
1
2
3
4
|
mes = "AskPython" bstr = ' ' .join( format ( ord (c), '08b' ) for c in mes) print (bstr) print ( type (bstr)) |
我们尝试转换为二进制字符串的字符串是“AskPython”,它被分配给变量 mes。
在下一行中,我们创建了一个名为 bstr 的变量,用于将字符串转换为二进制字符串。
让我们打破这行代码。
' '
– 二进制表示形式应该在打印时在它们之间有一个空格,因此我们使用带空格的引号。
.join(format(ord(c), '08b') for c in mess
– join 函数用于连接 ord 函数获得的不同二进制字符串,该函数用于获取字符串中每个字符的 Unicode 值。ord 函数获得的值在格式说明符 08b 的帮助下转换为二进制表示形式,使得二进制表示形式的每个部分只有八位。还有一个 for 循环迭代将字符串中的每个字符转换为二进制。
接下来,我们打印二进制字符串。在最后一行,我们还打印新二进制字符串的类型。
将二进制字符串转换为普通字符串
让我们尝试使用一些方法将二进制字符串转换为普通字符串。
使用 Bitarray 将二进制字符串转换为普通字符串
bitarray 是 PyPI 项目的一个库,用于生成布尔值数组(0 和 1)。由于它是一个库,因此需要在使用之前安装它。
这是安装该库的方法
Using the pip command pip install bitarray In the conda terminal conda install bitarray In notebooks(Jupyter or colab) ! pip install bitarray |
安装完成后,我们就可以导入并使用它。
1
2
3
4
5
6
|
from bitarray import bitarray bins = "01000001 01110011 01101011 01010000 01111001 01110100 01101000 01101111 01101110" bts = bitarray(bins) ascs = bts.tobytes().decode( 'ascii' ) print ( "The normal string is: " , ascs) print ( type (ascs)) |
首先,我们从 bitarray 库导入 bitarray 方法。
接下来,一个名为 bins 的变量用于存储一些二进制数据。创建另一个名为 bts 的变量,用于从二进制数据生成 8 位布尔值序列。
名为 ascs 的变量用于在 tobytes 和decode 的帮助下存储二进制数据到普通字符串的转换。编码模式指定为 ascii。
接下来的两行打印普通字符串和该普通字符串的类型。
使用 for 循环将二进制字符串转换为普通字符串
将二进制字符串转换为普通字符串的核心概念保持不变。但我们可以尝试使用 for 循环来迭代二进制数据并生成普通字符串。
1
2
3
4
5
6
7
8
|
bins = "0100100001100101011011000110110001101111" str = "" for i in range ( 0 , len (bins), 8 ): binc = bins[i:i + 8 ] num = int (binc, 2 ) str + = chr (num) print ( "The normal representation of " ,bins , "is" , str ) print ( type ( str )) |
首先我们声明一个字节数据并将其分配给bin。创建一个空字符串str来存储转换后的普通字符串。
我们初始化一个 for 循环来运行从 0 开始的二进制数据,一直到增量器 8 的 bin 长度。我们这样做是因为每个二进制数据都由 8 位组成。
binc 代表二进制块,它是二进制数据的一部分,每个数据有 8 位。
现在我们已经将二进制数据分成了相等的块,现在我们需要借助该int()
方法以及基数 2 将这些块转换为十进制值。
借助 的帮助将十进制值转换为关联的 ASCII 值chr()
。该 ASCII 值附加到空字符串 str。
最后,我们打印存储在 str 中的普通字符串以及 str 变量的类型。
使用列表理解
列表理解只是一种简短的形式,可以减少分散在多行中的代码。
代码如下。
1
2
3
4
5
|
bins = "01001000011001010110110001101100011011110101011101101111011100100110110001100100" binc = [bins[i:i + 8 ] for i in range ( 0 , len (bins), 8 )] nums = [ int (chunk, 2 ) for chunk in binc] str1 = ''.join( chr (num) for num in nums) print ( "The normal string is:" , str1) |
像往常一样,我们将二进制数据分配给变量箱。接下来,我们尝试创建称为 binc 的统一长度的二进制数据块。
现在我们已经将二进制数据分成了相等的块,现在我们需要借助该int()
方法以及基数 2 将这些块转换为十进制值。
一个名为str1的变量用于存储转换后的普通字符串。
最后,我们打印普通字符串。
观察上一个示例和这个示例。两者本质上是相同的。但通过列表理解,我们可以缩短代码并使其易于阅读。
使用按位运算符
我们可以使用按位运算将巨大的二进制数据分成统一的块。让我们看看如何做到这一点。
1
2
3
4
5
|
bins = "0100100001100101011011000110110001101111001000000101011101101111011100100110110001100100" num = int (bins, 2 ) str1 = num.to_bytes((num.bit_length() + 7 ) / / 8 , 'big' ).decode( 'ascii' ) print ( "The normal string is :" , str1) type (str1) |
像往常一样,我们将随机二进制数据分配给一个名为 bins 的变量。
接下来,我们创建一个名为 num 的变量,以以 2 为基数的整数格式存储与二进制数据相对应的十进制值。
创建一个名为 str1 的变量来存储转换后的结果。为了更清楚地解释,num变量的总长度加上7,然后除以8以获得相等的二进制数据块。该十进制数据被转换为字节,然后被解码。big
用于指定首先传输的最高有效位。
字符串和输出类型打印在最后两行。
结论
总而言之,我们了解了什么是二进制表示方案,以及它如何易于计算机理解,因为它以零和一的形式表示数据。
我们还看到了字符串和二进制字符串之间的区别。二进制字符串用于执行低级操作,而字符串则用于执行高级处理任务,例如 NLP。
接下来,我们学习了如何使用 bin() 函数从整数创建二进制字符串。我们还了解了如何用 0b 前缀表示二进制数据,以及如何在创建二进制字符串时删除此前缀。
谈到反向转换(二进制字符串到普通字符串),我们学习了四种方法。
首先,我们使用了一个名为bitarray
used的第三方库来处理巨大的二进制数据。该二进制数据被转换为字节,然后转换为正常的 ASCII 字符串。
在下一个方法中,我们使用 for 循环来执行相同的操作。但是,我们将巨大的二进制数据分成大小相等的块。这些块被转换为采用基数 2 编码的整数值。这些整数值用于解码为解码格式为 -ascii 的普通字符串。
下一个方法是列表理解。这是前一个示例的修改形式。
最后一种方法是使用按位运算符(//)将二进制数据划分为统一大小的块。