sun.misc.BASE64Encoder一行不能超过76字符,超过则添加回车换行符。

源码

public void encode(InputStream var1, OutputStream var2) throws IOException {
    byte[] var5 = new byte[this.bytesPerLine()];
    this.encodeBufferPrefix(var2);

while(true) {
        int var4 = this.readFully(var1, var5);
        if (var4 == 0) {
            break;
        }

this.encodeLinePrefix(var2, var4);

for(int var3 = 0; var3 < var4; var3 += this.bytesPerAtom()) {
            if (var3 + this.bytesPerAtom() <= var4) {
                this.encodeAtom(var2, var5, var3, this.bytesPerAtom());
            } else {
                this.encodeAtom(var2, var5, var3, var4 - var3);
            }
        }

if (var4 < this.bytesPerLine()) {
            break;
        }

this.encodeLineSuffix(var2);
    }

//每次循环步长为3
protected int bytesPerAtom() {
        return 3;
    }
//判断需要换行值
protected int bytesPerLine() {
        return 57;
}
//每次往var2中添加4个字节
this.encodeAtom
//println() 在Windows 回车换行符(\r\n),而Linux只有换行(\n),Mac只有回车(\r))

var2字节等于76(57/3*4)会添加回车换行符

如果我们使用是sun.misc.BASE64Decoder解密没有问题。

jdk1.8 Base64

使用方法

Base64.getDecoder().decode(str)
 getEncoder()使用的是 RFC4648
   public static Encoder getEncoder() {
         return Encoder.RFC4648;
    }
static final Encoder RFC4648 = new Encoder(false, null, -1, true);最大长度-1没有分隔符。

我们使用 Base64.getDecoder().decode(str)解密将会报错

private int decode0(byte[] src, int sp, int sl, byte[] dst) {
            int[] base64 = isURL ? fromBase64URL : fromBase64;
            int dp = 0;
            int bits = 0;
            int shiftto = 18;       // pos of first byte of 4-byte atom
            while (sp < sl) {
                int b = src[sp++] & 0xff;
                if ((b = base64[b]) < 0) {
                    if (b == -2) {         // padding byte '='
                        // =     shiftto==18 unnecessary padding
                        // x=    shiftto==12 a dangling single x
                        // x     to be handled together with non-padding case
                        // xx=   shiftto==6&&sp==sl missing last =
                        // xx=y  shiftto==6 last is not =
                        if (shiftto == 6 && (sp == sl || src[sp++] != '=') ||
                            shiftto == 18) {
                            throw new IllegalArgumentException(
                                "Input byte array has wrong 4-byte ending unit");
                        }
                        break;
                    }
                    if (isMIME)    // skip if for rfc2045
                        continue;
                    else
                        throw new IllegalArgumentException(
                            "Illegal base64 character " +
                            Integer.toString(src[sp - 1], 16));
解密是会报错误
  throw new IllegalArgumentException(
                            "Illegal base64 character " +
                            Integer.toString(src[sp - 1], 16));

错误提示如下:

java.lang.IllegalArgumentException: Illegal base64 character a

 

sun.misc.BASE64Encoder加密jdk1.8中Base64解密报错分析相关推荐

  1. sun.misc.BASE64Encoder详解

    #(一).BASE64编码规则及JAVA中的使用 ##1.编码规则: Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形 ...

  2. sun.misc.BASE64Encoder在Eclipse中不能直接使用的原因和解决方案

    1.为什么在Eclipse中不能直接使用sun.misc.BASE64Encoder和sun.misc.BASE64Decoder呢? 因为sun.misc.BASE64Encoder和sun.mis ...

  3. sun.misc.BASE64Encoder 不建议使用java.sun自带包中的内容

    import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder; 在项目中,设计到64位编码的.有时开发会用到JDK中自带的BASE64工具. ...

  4. 项目中提示找不到sun.misc.BASE64Encoder

    场景:使用JDK12时导入项目,结果报错,提示sun.misc.BASE64Encoder类找不到. 解决方案:把JDK12换成JDK8即可.

  5. IDEA解决sun.misc.BASE64Encoder找不到jar包的解决方法

    sun.misc.BASE64Encoder 不建议使用java.sun自带包中的内容 import sun.misc.BASE64Encoder; import sun.misc.BASE64Dec ...

  6. 在Idea解决找不到sun.misc.BASE64Encoder及sun.misc.BASE64Decoder找不到包

    在Idea解决找不到sun.misc.BASE64Encoder及sun.misc.BASE64Decoder找不到包的解决方法 报错原因: JDK从1.8升级到9.0.1后sun.misc.BASE ...

  7. sun.misc.BASE64Encoder找不到的解决方法

    sun.misc.BASE64Encoder找不到的解决方法 参考文章: (1)sun.misc.BASE64Encoder找不到的解决方法 (2)https://www.cnblogs.com/si ...

  8. Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法

    Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法 1).容器中登录my ...

  9. docker中安装nacos报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception

    docker中安装nacos报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception ...

最新文章

  1. 乘风破浪的马里奥!这个AI带你一口气通29关,你猜连AI都过不去的是哪3关?
  2. apu和atom处理器两者的定位
  3. 1063. Set Similarity (25)
  4. 登录页面test记录
  5. brackets作为html编辑器,为前端而生丨编辑器 Brackets 及配置推荐
  6. leetcode - 统计封闭岛屿的数目
  7. [golang]如何看懂调用堆栈
  8. OpenSSL之X509证书用法
  9. 微信代扣踩坑日记(微信自动续费)
  10. 用人话说说文明和文化
  11. Android动画的使用——补间动画
  12. 龙之谷2服务器维护,龙之谷2今日上线!详细攻略带你玩转阿尔特里亚大陆
  13. 1024*1024像素的图片,文件大小多少?
  14. 运营公众号成功的三大要素
  15. 【121期】面试官:什么是熔断?什么是服务降级?
  16. 图片与文字排版-flex
  17. 移动端二三事【五】:陀螺仪(重力感应器)实现手机位置、加速度感应以及常见应用。
  18. java架构师年薪_Java架构师一般的薪资是多少?高不高?
  19. 【web课程设计】HTML+CSS仿QQ音乐网站
  20. 常微分方程组解稳定性的分析

热门文章

  1. 漫画|我把老板炒鱿鱼了…
  2. 基于Canvas 六边形能力图(含动画)-干货满满~拿来就用!
  3. Notepadd++使用总结
  4. mui.back()返回刷新
  5. 31、查询1990年出生的学生名单(重点year)
  6. 基于Echarts实现可视化数据大屏中国地图城市区块选择代码
  7. 手机公司陷入集体焦虑
  8. 我的新浪博客地址升级了 1
  9. 计算机组装系统安装系统,usb怎么安装系统,详细教您电脑怎么安装系统
  10. Visual Basic工具栏不小心关闭的解决方法