Python:使用base64解码bin

Ziv*_*iva 0 python base64 encoding python-2.7

如果我有一个二进制字符串,让我们说str = "010100011010101001001101100101100110101"哪个是由其他字符串的base64版本编码的,我怎么能解码这个字符串?

met*_*ter 5

如果你的示例字符串实际上是有意义的东西而不是构成的东西会使这个问题变得不明确,那将是很好的,但我会尽我所能来找出你可能以最冗长的方式表达的意思.

假设您的实际输入是str这样的:

s = '101100101010011010000100011000001011010010110000100111000110000'
Run Code Online (Sandbox Code Playgroud)

您可以通过int使用base关键字参数将其转换为十六进制形式

>>> i = int(s, base=2)  # 6436561067884170800
Run Code Online (Sandbox Code Playgroud)

然后通过格式化将其转回字符串,如下所示:

>>> h = '%x' % i  # '595342305a584e30'
Run Code Online (Sandbox Code Playgroud)

然后使用binascii.a2b_hex十六进制字符串上的函数来获取原始字节:

>>> b64 = binascii.a2b_hex(h)  # b'YSB0ZXN0'
Run Code Online (Sandbox Code Playgroud)

如果它是一些有效的基本64位编码字节流,那么您可以使用base64.b64decode它来获取实际字节

>>> r = base64.b64decode(b64)  # b'a test'
Run Code Online (Sandbox Code Playgroud)

要将其转换为字符串,请将正确的编解码器应用于它(即使用bytes.encode).

最后,如果你想知道我是如何生成那个输入的,那就是上面所有的,反过来转换成一个单行函数:

>>> '{0:b}'.format(int(binascii.b2a_hex(base64.b64encode(b'a test')), base=16))
'101100101010011010000100011000001011010010110000100111000110000'
Run Code Online (Sandbox Code Playgroud)