求助关于 base64 的问题

Base64 报错

public static final String JWT_SECRET = "123";

String stringKey = Constant.JWT_SECRET;

byte[] encodedKey = Base64.decodeBase64(stringKey);

代码报错

java.lang.IllegalArgumentException: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible value. Expected the discarded bits to be zero.

修改后

public static final String str"1234;

String stringKey = Constant.str;

byte[] encodedKey = Base64.decodeBase64(stringKey);

运行成功
这是什么原因呢?

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2709 引用 • 7988 回帖 • 777 关注
  • Base64
    10 引用 • 16 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    1718 引用 • 11353 回帖 • 582 关注

赞助商 我要投放

被采纳的回答
  • 614756773 2 1 赞同

    楼主你的 123 解码过程就会如下:
    先根据 base64 编码表转换 123

    需要解码的字符 base64 中编号 六位二进制
    1 53 110101
    2 54 110110
    3 55 110111

    把这三组二进制放在一起就成了:110101110110110111
    然后按照每 8 位一组还原

    二进制 ASCII 码
    11010111 215 无,最大的 ASCII 码为 127
    01101101 109 m
    11 3 控制字符 ETX

    在还原 11010111 即215 是就会出错

11 回帖
请输入回帖内容 ...
  • yoss

    "123" 不是一个有效格式的 Base64 可解码字符串。"1234" 可以是因为长度刚好满足了 Base64 的要求。

    1 回复
  • johnsonxiaoyu

    我测试过 长度为 3 的倍数好像会报错

    1 回复
  • yoss 1

    了解一下 Base64 编码规则。

    1 回复
  • johnsonxiaoyu

    我好想明白了谢谢

  • 614756773

    base64 是将原数据按照每 3 字节一组转换成每 4 字节一组

    所以如果要判断一个字符串是不是由 base64 转换而来的,最基本的一条就是:这个字符串的长度必须是 4 的倍数

    顺便补充一条,base64 的 64 是指字符集合是由 A-Za-z0-9+/ 共 64 个字符组成,其实还包含一个作为垫字的 =

    所以判断字符串是否为 base64 的第二条规则就是,是否只含有上述的字符

  • 614756773

    举个编码的栗子吧,比如将 cat 转换为 base64 字符:

    C 的 ASCII 码为 99,二进制表示为 01100011

    a 的 ASCII 码为 97,二进制表示为 01100001

    t 的 ASCII 码为 116,二进制表示为 01110100

    排列在一起就是 011000110110000101110100

    然后平均分成 4 组,每组 6 位然后要补充两个 0,于是变成了

    二进制码 数值 对应的字符
    00011000 24 Y
    00110110 54 2
    00000101 5 F
    00110100 52 0

    所以最终的编码的结果就是 Y2F0,base64 的编码表如下:
    image.png
    image.png

    1 操作
    614756773 在 2020-02-28 18:19:13 更新了该回帖
  • 614756773 2 1 赞同

    楼主你的 123 解码过程就会如下:
    先根据 base64 编码表转换 123

    需要解码的字符 base64 中编号 六位二进制
    1 53 110101
    2 54 110110
    3 55 110111

    把这三组二进制放在一起就成了:110101110110110111
    然后按照每 8 位一组还原

    二进制 ASCII 码
    11010111 215 无,最大的 ASCII 码为 127
    01101101 109 m
    11 3 控制字符 ETX

    在还原 11010111 即215 是就会出错

    2 回复
  • johnsonxiaoyu

    感谢你的回复看完了你的表述让我的理解更加透彻了

  • johnsonxiaoyu

    这里我了解到的是 6 位的话会往前面补充两个 0 123 最终的是否是 001101 000111 000110 110111

    1 回复
  • 614756773

    哦对 是这样的,我遗漏掉了

  • ferried

    mark 一下

请输入回帖内容 ...