java.lang.IllegalArgumentException: Last encoded character (before the paddings if any)

本文探讨了在新设备上线后,使用Guava替换Commons-codec库解决base64解码错误的问题,介绍了问题出现的原因、解决方案以及Guava和Apache Commons的对比,重点在于编码库的迁移和Guava的实用工具.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

base64解码:开发报错误

分析原因

解决方案

延申:

Google guava和Apache commons

Guava记录:

Apache Commons的一些方法记录:


base64解码:开发报错误

问题来源 今天在开发对接的过程中,设备方传过来的是base64的报文,之前使用的是commonsc-codec进行解密,但今早新设备上线后 新发的报文如下的错误,老设备以往的报文能正常解析:

 


分析原因


于是,到源码里面看报错信息的出处,原来问题出现在这里,commonsc-codec在升级之后,其内部做了一个validateCharacter校验,草报出这样的错误。

/**
     * Validates whether decoding the final trailing character is possible in the context
     * of the set of possible base 64 values.
     *
     * <p>The character is valid if the lower bits within the provided mask are zero. This
     * is used to test the final trailing base-64 digit is zero in the bits that will be discarded.
     *
     * @param emptyBitsMask The mask of the lower bits that should be empty
     * @param context the context to be used
     *
     * @throws IllegalArgumentException if the bits being checked contain any non-zero value
     */
    private static void validateCharacter(final int emptyBitsMask, final Context context) {
        if ((context.ibitWorkArea & emptyBitsMask) != 0) {
            throw new 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.");
        }
    }


解决方案


可以使用谷歌的guava来替换common-codec来解密base64格式的文件

 <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
 <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>30.1.1-jre</version>
 </dependency>


如下代码解析代码:

 

//        byte[] decoded = Base64.decodeBase64(base64);
        byte[] decoded = BaseEncoding.base64().decode(base64);


结果能正常解析。


延申:

以下搬运工

Google guava和Apache commons

Guava 是一个 Google 的基于java类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等

Apache Commons是对JDK的拓展,包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动。官网网址:http://commons.apache.org

Guava记录:

  一、源码包的简单说明:
  com.google.common.annotations:普通注解类型。
  com.google.common.base:基本工具类库和接口。
  com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存。
  com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类,这里你会发现很多好玩的集合。
  com.google.common.eventbus:发布订阅风格的事件总线。
  com.google.common.hash: 哈希工具包。
  com.google.common.io:I/O工具包。
  com.google.common.math:原始算术类型和超大数的运算工具包。
  com.google.common.net:网络工具包。
  com.google.common.primitives:八种原始类型和无符号类型的静态工具包。
  com.google.common.reflect:反射工具包。
  com.google.common.util.concurrent:多线程工具包。

  二、类库使用手册:

  一.  基本工具类:让使用Java语言更令人愉悦。

  1. 使用和避免 null:null 有语言歧义, 会产生令人费解的错误, 反正他总是让人不爽。很多 Guava 的工具类在遇到 null 时会直接拒绝或出错,而不是默默地接受他们。
  2. 前提条件:更容易的对你的方法进行前提条件的测试。
  3. 常见的对象方法: 简化了Object常用方法的实现, 如 hashCode() 和 toString()。
  4. 排序: Guava 强大的 "fluent Comparator"比较器, 提供多关键字排序。
  5. Throwable类: 简化了异常检查和错误传播。

  二.  集合类:集合类库是 Guava 对 JDK 集合类的扩展, 这是 Guava 项目最完善和为人所知的部分。

  1. Immutable collections(不变的集合): 防御性编程, 不可修改的集合,并且提高了效率。
  2. New collection types(新集合类型):JDK collections 没有的一些集合类型,主要有:multisets,multimaps,tables, bidirectional maps等等
  3. Powerful collection utilities(强大的集合工具类): java.util.Collections 中未包含的常用操作工具类
  4. Extension utilities(扩展工具类): 给 Collection 对象添加一个装饰器? 实现迭代器? 我们可以更容易使用这些方法。

  三.  缓存: 本地缓存,可以很方便的操作缓存对象,并且支持各种缓存失效行为模式。

  四.  Functional idioms(函数式): 简洁, Guava实现了Java的函数式编程,可以显著简化代码。

  五. Concurrency(并发):强大,简单的抽象,让我们更容易实现简单正确的并发性代码。

  1. ListenableFuture(可监听的Future): Futures,用于异步完成的回调。
  2. Service: 控制事件的启动和关闭,为你管理复杂的状态逻辑。

  六. Strings: 一个非常非常有用的字符串工具类: 提供 splitting,joining, padding 等操作。

  七. Primitives: 扩展 JDK 中未提供的对原生类型(如int、char等)的操作, 包括某些类型的无符号的变量。

  八. Ranges: Guava 一个强大的 API,提供 Comparable 类型的范围处理, 包括连续和离散的情况。

  九. I/O: 简化 I/O 操作, 特别是对 I/O 流和文件的操作, for Java 5 and 6.

  十. Hashing: 提供比 Object.hashCode() 更复杂的 hash 方法, 提供 Bloom filters.

  十一. EventBus: 基于发布-订阅模式的组件通信,但是不需要明确地注册在委托对象中。

  十二. Math: 优化的 math 工具类,经过完整测试。

  十三. Reflection: Guava 的 Java 反射机制工具类。

Apache Commons的一些方法记录:

  • Commons BeanUtils

  针对Bean的一个工具集。由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装。

  一个比较常用的功能是Bean Copy,也就是copy bean的属性。如果做分层架构开发的话就会用到,比如从PO(Persistent Object)拷贝数据到VO(Value Object)

  • Commons Codec

  是编码和解码组件,提供常用的编码和解码方法,如DES、SHA1、MD5、Base64、URL和Soundx等。

  • Commons Collections

  是一个集合组件,扩展了Java标准Collections API,对常用的集合操作进行了很好的封装、抽象和补充,在保证性能的同时大大简化代码。

  • Commons Compress

  是一个压缩、解压缩文件的组件,可以操作rar、cpio、Unix dump、tar、zip、gzip、XZ、Pack200和bzip2格式的压缩文件。

  • Commons Configuration

  是一个Java应用程序的配置管理工具,可以从properties或者xml文件中加载配置信息。

  • Commons CSV

  是一个用来读写各种Comma Separated Value(CSV)格式文件的Java类库。

  • Commons Daemon

  实现将普通的Java应用变成系统的后台服务,例如 Tomcat 就是利用这个项目来实现作为 Linux 和 Windows 的服务启动和停止的。

  •  Commons DBCP

  数据库连接池。

  • Commons DBUtils

  是JDBC工具组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List。

  •  Commons Digester

  是XML到Java对象的映射工具集。

  •  Commons Email

  是邮件操作组件,对Java Mail API进行了封装,提供了常用的邮件发送和接收类,简化邮件操作。该组件依赖Java Mail API。

  • Commons Exec

  提供一些常用的方法用来执行外部进程,如执行exe文件或命令行。

  •  Commons FileUpload

  为Web应用程序或Servlet提供文件上传功能,Struts2和SpringMVC的文件上传组件。

  • Commons IO

  是处理IO的工具类包,对java.io进行扩展,提供了更加方便的IO操作。

  • Commons JCI

  提供通用的Java编译器接口。

  • Commons Lang3

  是处理Java基本对象方法的工具类包,该类包提供对字符、数组等基本对象的操作,弥补了java.lang api基本处理方法上的不足。

  • Commons Launcher

  可以跨平台独立启动的java应用程序。

  • Commons Logging

  提供统一的日志接口,同时兼顾轻量级和不依赖于具体的实现。类包给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。

  • Commons Math

  轻量级自容器的数学和统计计算方法类包,包含大多数常用的数值算法。

  • Commons Net

  封装了各种网络协议的客户端,支持FTP、NNTP、SMTP、POP3、Telnet等协议。

  • Commons Pool

  提供了一整套用于实现对象池化的框架,以及若干各具特色的对象池实现,可以有效地减少处理对象池化时的工作量。类包用于提高像文件句柄、数据库连接、socket通信这类大对象的调用效率,简单的说就是一种对象一次创建多次使用的技术。

  •  Commons Primitives

  提供了一个更小,更快和更易使用的对Java基本类型的支持。

  • Commons Validator

  提供了一个简单的、可扩展的框架来在一个XML文件中定义校验器(校验方法)和校验规则。支持校验规则的和错误消息的国际化。

  •  Apache HttpClient

  曾经是Apache Commons的子项目,后来独立出来。HttpClient简化HTTP客户端与服务器的各种通讯,实现HTTP客户端程序(也就是浏览器程序)的功能。

GoogleGuava Splitter 对比 Apache StringUtils

  GoogleGuava 速度比apache的快

感谢提供者:

Guava:好用的java类库 学习小记 - yweihainan - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值