java.util.Base64解码然后编码产生不同的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.util.Base64解码然后编码产生不同的字符串相关的知识,希望对你有一定的参考价值。

问题:解码Fz + =然后将其编码回来产生Fz8 =

以下代码:

new String(Base64.getEncoder().encode(Base64.getDecoder().decode("Fz+=".getBytes("UTF-8"))))

给出以下字符串:Fz8 =

+怎么变成8?

我必须在这里遗漏一些东西。

Fz + =位模式:000101 110011 111110 000000

重新排列为8位组:00010111 00111111 10000000

小数:23 63 128

这将需要3个字节来表示它。

但是,当我尝试这个代码时:

Base64.getDecoder().decode("Fz+=".getBytes("UTF-8"))

我得到以下十进制数组:

 [23, 63]

最后一个字节(1000 0000)去了哪里?这就是我们编码时+变成8的原因。

答案

输入字符串Fz+=不是有效的Base64编码。

根据定义,如果编码的字符串以单个填充字符结尾,则导致该编码四元组的输入仅包含两个字节。在编码时,双字节输入应该用0x00填充,以形成一个完整的3字节单元,然后编码为4个Base64代码字节。

无论是什么产生的字符串Fz+=错误地用0x80填充2字节输入。或者,编码器误将0x80误认为是0x00,因为它期待纯粹的7位ASCII。

无论原因如何,Fz+=输入无效,解码器只忽略了额外的两位。

如果输入确实是00010111 00111111 10000000,那么正确的编码是没有填充的Fz+A和代表A000000代码。同样,这可能是由于最初进行编码的任何错误。

以上是关于java.util.Base64解码然后编码产生不同的字符串的主要内容,如果未能解决你的问题,请参考以下文章

为什么java.util.Base64和org.apache.commons.ssl.Base64彼此不兼容?

从文件中读取数据并编码成base64 java

java.util.Base64

将 .EXE 编码/解码为 Base64

2D morton 代码编码/解码 64 位

java新版本Base64Encoder和Base64Decoder无法使用解决方案