【问题标题】:base64.decode: Invalid encoding before paddingbase64.decode:填充前编码无效
【发布时间】:2021-06-28 19:26:26
【问题描述】:

我正在做一个颤振项目,目前我尝试使用 base64.decode() 方法解码的一些字符串出现错误。我创建了一个简短的 dart 代码,它可以重现我在使用特定字符串时遇到的问题:

import 'dart:convert';

void main() {
  final message = 'RU5UUkVHQUdSQVRJU1==';
  print(utf8.decode(base64.decode(message)));
}

我收到以下错误消息:

Uncaught Error: FormatException: Invalid encoding before padding (at character 19)
RU5UUkVHQUdSQVRJU1==

我试过用 JavaScript 解码相同的字符串,它工作正常。如果有人能解释我为什么会收到这个错误,并可能告诉我一个解决方案,我会很高兴。谢谢。

【问题讨论】:

    标签: string flutter dart base64 decode


    【解决方案1】:

    Base64 编码将二进制数据分解为 3 个完整字节的 6 位段,并将这些段表示为 ASCII 标准中的可打印字符。它基本上分两步完成。

    第一步是将二进制字符串分解为 6 ​​位块。 Base64 仅使用 6 位(对应 2^6 = 64 个字符)来确保编码数据可打印和人类可读。没有使用 ASCII 中可用的特殊字符。

    这 64 个字符(因此命名为 Base64)是 10 个数字、26 个小写字符、26 个大写字符以及加号 (+) 和正斜杠 (/)。还有一个第 65 个字符称为填充,即等号 (=)。当二进制数据的最后一段不包含完整的 6 位时使用此字符

    所以 RU5UUkVHQUdSQVRJU1== 不遵循编码模式。

    【讨论】:

    • 您说RU5UUkVHQUdSQVRJU1== 不遵循编码模式是错误的。否则,请告诉我为什么 base64.b64decode('RU5UUkVHQUdSQVRJU1==').decode() 在 Python 中返回 'ENTREGAGRATIS'(并且也适用于 .NET),并且 OP 确认它在 JavaScript 中可以正常工作?
    • 感谢您抽出宝贵时间回答。但正如约瑟夫所说,我也尝试使用其他语言对其进行解码,并且它确实可以毫无问题地解码。此外,当我运行 isBase64 时,它返回 true,所以我不明白为什么会出现错误。
    • @JosefZ,我对它做了一些研究,发现它确实不遵循模式,也许 dart 没有那么强大,无法转换或理解这个 hashkey。这就是我在 dart:convert, /// 检查 [_state] 表示有效解码的内容。 void close(String? input, int? end) { if (_state 0) { throw FormatException("长度无效,必须是四的倍数", input, end); } _state = _encodePaddingState(0); }
    • 我会弄乱字符串,然后看看我能对编码做些什么。再次感谢您的努力。当我找到解决方案时,我会再回来。
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多