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

时间:2018-01-02 19:16:46

标签: java 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的原因。

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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