为什么我看不到解码后的字符串?

时间:2014-09-02 19:24:41

标签: python-3.x base64 decode

我有一个base64字符串,我试图找出它是什么,但我看不到任何东西。我究竟做错了什么?这是

>>> import base64
>>> b = base64.b64decode("FAAAAAMAAAAGAAAACQAAAAwAAAA=")
>>> b
b'\x14\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\x0c\x00\x00\x00'
>>> print(b.decode("utf16"))


>>> print(b.decode("utf8"))


>>> 

1 个答案:

答案 0 :(得分:2)

它是Base 64编码,然后它不是UTF-16编码,也不是UTF-8。看看RFC 3548。 Base 64可以在文档的第4页找到。

非常,目的不同。 UTF-x编码用于将unicode字符串编码为二进制流。也就是说,抽象字符串是解码形式。另一方面,Base X等编码在这里编码原始二进制文件到选定的ASCII值流(基本上是小整数),以便二进制内容可以通过电子邮件传输只接受字符。二进制是经过解码的原始形式。

在你的情况下,它看起来好像是整数系列(32位)被转移:20,3,6,9和12。

稍后更新以回答以下评论:我如何获得价值......

b'\x14\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\x0c\x00\x00\x00'

文字的b前缀表示它是bytes类型值的文字。 bytes是一个小整数流 - 每个字节的一个字节,从0到255.当显示为文字时,如果相关的ASCII字符不能轻易显示,则使用小整数的十六进制表示法 - 以\x开头,后跟两个十六进制数字。 \t是制表符的表示,其序号值为9。

但是,您也可以将其转换为整数列表:

>>> list(b)
[20, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0, 9, 0, 0, 0, 12, 0, 0, 0]

现在更明显了。如果值足够小以适合单个字节,则零是填充符。字节顺序是由OS /机器的字节序引起的。所以,实际上,它应该是hexa(作为五个32位整数):

00000014 00000003 00000006 00000009 0000000c

这是:

      20        3        6        9       12

换句话说,b'\x14\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\x0c\x00\x00\x00'实际上不是字符串。它是bytes字面值,可捕获5 * 4字节的值。 bytes是一个小整数序列,而不是字符序列。当你尝试时更明显:

>>> for value in b:
...     print(value)
...    
20
0
0
0
3
0
0
0
6
0
0
0
9
0
0
0
12
0
0
0
>>> type(b)
<class 'bytes'>
>>> type(b[0])
<class 'int'>
>>>