【问题标题】:why can't I see the decoded string?为什么我看不到解码的字符串?
【发布时间】:2014-09-02 19:24:41
【问题描述】:

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


>>> 

【问题讨论】:

    标签: python-3.x base64 decode


    【解决方案1】:

    它是 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]
    

    现在更明显了。如果值足够小以适合单个字节,则零是填充符。字节顺序是由操作系统/机器的字节序引起的。所以,实际上,它应该是 hexa(作为 5 个 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'>
    >>>
    

    【讨论】:

    • 感谢您的回答。你能告诉我你是如何从那个字符串中得到整数值的吗?我试图从以 base 64 编码的字符串中理解。
    • 20是否应该与编码字符串中的整数总数相关联?
    • 不是字符串。它是bytes 值。无论如何,20 绝对与 Python 无关。原始字符串只是一个字符串,base64.b64decode 的结果是一个字节序列。我对这些值可能是五个 32 位整数的解释只是推测。它与您的问题有关。我不知道应该如何准确地解释该值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2017-06-26
    • 2014-03-10
    • 2015-12-24
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多