java解码base64字符串并重新编码返回的字节不会返回相同的字符串
我正在对base64字符串进行简单解码。当我重新编码时,我不会得到相同的字符串。我错过了什么
String base64 = "R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edf";
byte[] decoded = Base64.getDecoder().decode(base64.getBytes());
String encoded = Base64.getEncoder().encodeToString(decoded);
您可以看到字符串encoded
与输入字符串base64
不同:
R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edc=
# 1 楼答案
Base64通过从64个(6位)可显示字符(4*6=24位)中选择,将3个字节(3*8=24位)编码为4个字符。有关其工作原理的详细说明,请参见Wikipedia
所以,每4个编码字符,就有3个字节。你的意见是:
R3df 789G Sfsb 2edf SFSD Fuik uikk 2349 GSfs b2ed fSvF SDFR 3df7 89GS fsb2 edf
如您所见,这是一个由4个字符组成的15个块,最后一个块只有3个字符。3个字符(3*6=18位)可以存储2个字节(2*8=16位),留下2个未使用的位。这两个位可以有任何值,因为它们是未使用的,但标准是将这些额外位设置为0
您的输入来自选择将额外位设置为1的Base64编码,因此最后一个字符是
f
,而不是标准的c
通过在末尾添加1或2个
=
符号,将编码文本填充到完整块也是很常见的,尽管并不总是必需的。因此,按照使用0作为额外位并添加填充的标准,最后一个块变成了edc=
,但它解码为与edf
的非标准最后一个块相同的字节