求助关于 base64 的问题

本贴最后更新于 2124 天前,其中的信息可能已经水流花落

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3206 引用 • 8217 回帖
  • Base64
    9 引用 • 14 回帖 • 1 关注
  • Q&A

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

    11160 引用 • 50678 回帖 • 50 关注

相关帖子

被采纳的回答
  • 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 是就会出错

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 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

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

  • mark 一下

请输入回帖内容 ...

推荐标签 标签

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    285 引用 • 248 回帖 • 1 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    188 引用 • 833 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 429 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    316 引用 • 547 回帖 • 3 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    33 引用 • 108 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    25 引用 • 373 回帖 • 4 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • OpenCV
    15 引用 • 36 回帖 • 1 关注
  • CodeMirror
    2 引用 • 17 回帖 • 197 关注
  • 音乐

    你听到信仰的声音了么?

    63 引用 • 513 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 193 关注
  • 倾城之链
    23 引用 • 66 回帖 • 187 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    466 引用 • 1241 回帖 • 610 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    51 引用 • 200 回帖 • 1 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    97 引用 • 155 回帖
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 86 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 144 回帖 • 3 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 576 关注
  • Anytype
    3 引用 • 31 回帖 • 60 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 328 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    60 引用 • 22 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 298 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    54 引用 • 190 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖