2014-09-02 43 views
0

我有一个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")) 


>>> 

回答

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] 

现在是更加明显。如果值足够小以适合单个字节,则零是填充符。字节的顺序是由操作系统/机器的字节序造成的。所以,实际上,应该是六(五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'> 
>>> 
+0

感谢您的回答。你能告诉我你是如何得到该字符串的整数值的?我试图从基于64编码的字符串中找出一些意义。 – aaragon 2014-09-02 20:31:44

+0

应该将20与编码字符串中的整数数量相关联吗? – aaragon 2014-09-02 21:48:45

+0

这不是一个字符串。它是'字节'值。无论如何,'20'肯定不是* Python相关的。原始字符串只是一个字符串,“base64.b64decode”的结果是一个字节序列。我的解释是,这些值可能是五个32位整数,只是猜测。这是你的问题相关。我不知道如何解释价值。 – pepr 2014-09-03 13:49:53

相关问题