我正在对 base64 字符串进行简单的解码。当我重新编码时,我没有得到相同的字符串。我错过了什么?String base64 = "R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edf";byte[] decoded = Base64.getDecoder().decode(base64.getBytes());String encoded = Base64.getEncoder().encodeToString(decoded);您可以看到该字符串encoded与输入字符串不同base64:R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edc=
1 回答
守候你守候我
TA贡献1802条经验 获得超10个赞
Base64通过从 64 (6 位)可显示字符(4 * 6 = 24 位)中进行选择,将 3 个字节(3 * 8 = 24 位)编码为 4 个字符。有关其工作原理的详细说明,请参阅维基百科。
因此,对于每 4 个编码字符,您将获得 3 个字节。您的输入是:
R3df 789G Sfsb 2edf SFSD Fuik uikk 2349 GSfs b2ed fSvF SDFR 3df7 89GS fsb2 edf
如您所见,这是 15 个 4 个字符的块,最后一个块只有 3 个字符。3 个字符(3 * 6 = 18 位)可以存储 2 个字节(2 * 8 = 16 位),留下 2 个未使用的位。这 2 位可以具有任何值,因为它们未被使用,但标准是将此类额外位设置为 0。
您的输入来自 Base64 编码,该编码选择将额外位设置为 1,因此最后一个字符是f
,而不是标准的c
.
通过=
在末尾添加 1 或 2 个符号来将编码文本填充到完整块也是很常见的,尽管并不总是必需的。因此,使用 0 作为额外位并添加填充的标准,最终块变为edc=
,但它解码为与 的非标准最终块相同的字节edf
。
添加回答
举报
0/150
提交
取消