问题:解码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的原因。
答案 0 :(得分:4)
输入字符串Fz+=
不是有效的Base64编码。
根据定义,如果编码的字符串以单个填充字符结尾,则导致该编码四元组的输入仅包含两个字节。编码时,应该用0x00
填充双字节输入,以生成一个完整的3字节单元,然后将其编码为4个Base64代码字节。
无论是什么产生,字符串Fz+=
都错误地用0x80
填充了2字节输入。或者,编码器错误地将0x80
误认为是0x00
,因为它期望纯粹的7位ASCII。
无论原因如何,Fz+=
输入无效,解码器只忽略了额外的两位。
如果输入确实是00010111 00111111 10000000
,那么正确的编码是Fz+A
,没有填充,A
代码代表000000
。同样,这可能是由于最初进行编码的任何错误。