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