【问题标题】:How to decode base64 to single bytes?如何将base64解码为单字节?
【发布时间】:2021-09-16 15:36:35
【问题描述】:

在以下代码中:

import base64
base64.decodebytes('DBCCOAABAMA='.encode('ascii'))

结果是

b'\x0c\x10\x828\x00\x01\x00\xc0'

第三个字节是\x828,它不适合单个字节并导致我的脚本出现问题。除了ASCII,我不想将其解码为其他任何东西。

最初的base64编码器有什么问题吗? 为什么会出现这个问题,我该如何解决?


更新:

我面临的问题是代码

base64.decodebytes('DBCCOAABAMA='.encode('ascii')).decode('ascii')

导致错误

UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 2: ordinal not in range(128)

【问题讨论】:

    标签: python arrays python-3.x base64 ascii


    【解决方案1】:

    如果某些字节在可打印字符范围内,则不会以十六进制转义形式打印。这段代码向您展示了真正发生的事情:

    >>> for b in base64.decodebytes('DBCCOAABAMA='.encode('ascii')):
        print(hex(b), chr(b))
    
    0xc 
    0x10 
    0x82 ‚
    0x38 8
    0x0 
    0x1 
    0x0 
    0xc0 À
    

    附:我不明白为什么encode 没有抛出错误,其中一些字节超出了 ASCII 范围。

    【讨论】:

    • 我面临的问题是代码base64.decodebytes('DBCCOAABAMA='.encode('ascii')).decode('ascii')导致错误UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 2: ordinal not in range(128)
    • @mercury 那么你必须找出真正的编码是什么,因为它肯定不是 ASCII。
    • 一个 ascii 可以是 0x00 到 0xFF 之间的任何值,不是吗?
    • @mercury 不,ASCII 仅正式进入 0x7f。有很多扩展使用 0x80-0xff 范围,但它们被称为别的东西。
    • 我应该为 0x00 到 0xFF 的范围选择什么解码?是iso-8859-1吗?
    猜你喜欢
    • 2017-01-05
    • 1970-01-01
    • 2013-01-12
    • 2020-07-25
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2020-10-26
    • 2011-11-03
    相关资源
    最近更新 更多