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
和代表A
的000000
代码。同样,这可能是由于最初进行编码的任何错误。
以上是关于java.util.Base64解码然后编码产生不同的字符串的主要内容,如果未能解决你的问题,请参考以下文章