将二进制字符串转换为普通字符串的 4 种方法

二进制字符串用于以字节形式存储数据。字节是计算机编程中的一个单位,由 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 的类型。

整数转二进制(不带 0b)

将字符串转换为二进制字符串

我们已经了解了如何将整数转换为二进制字符串。现在让我们获取一个字符串并将其转换为二进制字符串。

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 循环迭代将字符串中的每个字符转换为二进制。

接下来,我们打印二进制字符串。在最后一行,我们还打印新二进制字符串的类型。

字符串转二进制字符串

阅读这篇文章以了解有关 ord() 的更多信息。

将二进制字符串转换为普通字符串

让我们尝试使用一些方法将二进制字符串转换为普通字符串。

使用 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。

接下来的两行打印普通字符串和该普通字符串的类型。

使用 Bitarray 将二进制字符串转换为普通字符串

使用 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 变量的类型。

使用 For 循环将二进制字符串转换为普通字符串

使用列表理解

列表理解只是一种简短的形式,可以减少分散在多行中的代码。

阅读:Python 中的列表理解是什么?

代码如下。

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 前缀表示二进制数据,以及如何在创建二进制字符串时删除此前缀。

谈到反向转换(二进制字符串到普通字符串),我们学习了四种方法。

首先,我们使用了一个名为bitarrayused的第三方库来处理巨大的二进制数据。该二进制数据被转换为字节,然后转换为正常的 ASCII 字符串。

在下一个方法中,我们使用 for 循环来执行相同的操作。但是,我们将巨大的二进制数据分成大小相等的块。这些块被转换为采用基数 2 编码的整数值。这些整数值用于解码为解码格式为 -ascii 的普通字符串。

下一个方法是列表理解。这是前一个示例的修改形式。

最后一种方法是使用按位运算符(//)将二进制数据划分为统一大小的块。

参考

访问PyPI官方文档了解更多关于bitarray的信息。

阅读有关 Numpy 库的 tobytes() 方法的更多信息。