为什么我看不到解码的字符串?
问题描述:
我有一个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"))
>>>
答
它是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'>
>>>
感谢您的回答。你能告诉我你是如何得到该字符串的整数值的?我试图从基于64编码的字符串中找出一些意义。 – aaragon 2014-09-02 20:31:44
应该将20与编码字符串中的整数数量相关联吗? – aaragon 2014-09-02 21:48:45
这不是一个字符串。它是'字节'值。无论如何,'20'肯定不是* Python相关的。原始字符串只是一个字符串,“base64.b64decode”的结果是一个字节序列。我的解释是,这些值可能是五个32位整数,只是猜测。这是你的问题相关。我不知道如何解释价值。 – pepr 2014-09-03 13:49:53