如何在Python中把一个字符串转换成二进制

4,451 阅读6分钟
  • 摘要: 你可以在Python中使用将一个字符串转换为二进制。
    • bytearray() + bin()
    • map() + bin() + bytearray()
    • join() + format() + bytearray()
    • join() + format() + ord()
    • binascii.hexlify()

问题:如何在Python中把一个给定的字符串转换成二进制等价物?

例子。当你将一个字符串转换为二进制时,它要么产生一个由二进制值组成的列表,代表给定字符串的原始字符,要么代表整个字符串的整个二进制值。

Input:
given_string = "xyz"

Expected output:
['0b1111000', '0b1111001', '0b1111010']
or
1111000 1111001 1111010

让我们深入研究众多的方法,这些方法将帮助我们得出所需的输出。我们将深入研究用于解决关键任务问题的每个函数。因此,不再拖延,让游戏开始吧。


相关阅读。将字节转换为字符串

方法1:使用bytearray+bin

方法。

  • 通过调用bytearray(string, encoding) ,将给定的字符串转换为字节数组对象。bytearray对象将字符串的字符表示为字节。
  • 使用for-loop遍历每个字节,并在每个字节上使用bin 方法,将其转换为二进制表示。
  • 在另一个列表中追加结果的二进制表示法。

代码。

word = "xyz"
# convert string to bytearray
byte_arr = bytearray(word, 'utf-8')
res = []
for byte in byte_arr:
    binary_rep = bin(byte)  # convert to binary representation
    res.append(binary_rep)  # add to list
print(res)

输出。

['0b1111000', '0b1111001', '0b1111010']

🔋去掉 "0b "前缀。

上述方法导致创建的二进制值的前缀是 "0b",这表明它是一个用二进制系统而不是十进制系统表示的数字。由于你已经知道输出是一个二进制数,因此你可以通过以下方法消除前缀 切片的二进制数,并从二进制字符串的索引2开始。

你可以进一步使用join 方法将所有的二进制字符串连接在一起,一次性得到整个字符串的二进制表示。

代码。

word = "xyz"
# convert string to bytearray
byte_arr = bytearray(word, 'utf-8')
res = []
for byte in byte_arr:
    binary_rep = bin(byte)  # convert to binary representation
    res.append(binary_rep[2:])  # remove prefix "0b" and add to list
print(' '.join(res))  # join all the binaries of res list

输出。

1111000 1111001 1111010

💡读者文摘

Python 内置的bytearray() 方法接收一个可迭代的数据,如 0 到 256 之间的整数列表,将它们转换为0000000011111111 之间的字节,并返回一个新的字节数组作为一个[bytearray](https://docs.python.org/3/library/stdtypes.html#bytearray)类。

Python 的内置**bin(integer)**函数需要一个整数参数,并返回一个前缀为"0b" 的二进制字符串。如果你在一个非整数的x 上调用bin(x) ,它必须定义__index__() 方法,返回一个与x 相关的整数。否则,它将抛出一个TypeError: object cannot be interpreted as an integer

推荐阅读。Python打印没有'0b'的二进制

方法2:使用map()+bin()+bytearray()

方法。下 面的解决方案是一个单行本。让我们来分解并尝试理解将使用的单线程的每一段。

  • 使用map 函数将byte 对象传递给bin 函数。bytearray(string, encoding) 将字符串转换为一个字节对象。
  • 当字节对象中的每个字节被传递给bin函数时,它将它们转换为它们的二进制等价物。
  • 使用list 构造函数将map 方法返回的对象转换为一个列表。
  • 为了生成一个代表整个字符串的二进制字符串,使用一个**列表理解**,这样。
    • 表达式x[2:] ,表示从索引2开始的二进制字符串,以避免二进制前缀 "0b"。
    • 上下文变量,即x代表我们从map对象中生成的列表中的每个项目/二进制值。
  • 最后,使用' '.join 方法,在上面的列表上一次性获得整个字符串的二进制表示法的理解。

代码。

word = "xyz"
res = ' '.join([x[2:] for x in list(map(bin, bytearray(word, 'utf-8')))])
print(res)

输出。

1111000 1111001 1111010

💡读者文摘

map() 函数通过对每个迭代表的第i个元素应用一个 "转化器函数 "将一个或多个迭代表转化为一个新的迭代表。参数是转化器函数对象一个或多个迭代变量。如果你传递n个迭代变量作为参数,转化器函数必须是一个n次方函数,接受n输入参数。返回值是一个可迭代的地图对象,其中包括已转换的元素,也可能包括已聚合的元素。

方法3:使用join+format+bytearray

方法。

  • 使用bytearray 函数将给定的字符串转换为字节对象,使字节对象将字符串的每个字符表示为字节。
  • 然后调用format(x, 'b') 方法将字节对象转换为二进制表示,然后使用join 方法将每个转换的字符连接起来,形成一个字符串。

代码。

word = "xyz"
res = ' '.join(format(x, 'b') for x in bytearray(word, 'utf-8'))
print(res)

输出。

1111000 1111001 1111010

💡读者文摘

Python 内置的format(value, spec) 函数将一种格式的输入转换为你定义的另一种格式的输出。具体来说,它将格式指定器spec 应用于参数value 并返回格式化的表示value 。例如,format(42, 'f') 返回字符串表示'42.000000'

**str.join(iterable)**将一个iterable 中的元素连接起来。其结果是一个字符串,其中迭代器中的每个元素都被 "粘在一起",它被称为分隔符的字符串。

方法4:使用join()+format()+ord()

方法。这 里的想法与上面解释的方法很相似。唯一不同的是,在这种情况下,使用ord函数代替bytearray,将给定字符串的字符转换成Unicode表示。

代码。

word = "xyz"
res = ' '.join(format(ord(x), 'b') for x in word)
print(res)

输出。

1111000 1111001 1111010

💡读者文摘

Python**ord()** 函数将一个字符(=长度为1的字符串)作为输入,并返回这个字符的Unicode编号。例如,ord('a') 返回 Unicode 数字97ord() 的反函数是chr() 函数,所以chr(ord('a')) 返回原始字符'a'

方法5:使用hexlify

方法。

  • 调用bytes(word, 'utf-8') 函数,将给定的字符串转换为字节对象。
  • 使用binary.hexlify ,返回二进制数据的十六进制表示,然后通过指定16为基数将其转换为一个整数对象。
  • 最后,用bin 函数将其转换为二进制表示法。

代码。

import binascii
word = "xyz"
w = bytes(word, 'utf-8')
res = bin(int(binascii.hexlify(w),16))
print(res[2:])

输出。

11110000111100101111010

结论

吁!这的确是一个全面的旅程。这的确是一个全面的旅程,我们学到了多达五种不同的方法来征服给定的问题。请随意尝试,并使用适合你的方法。