解码 base64 字符串并重新编码返回的字节不会返回相同的字符串

我正在对 base64 字符串进行简单的解码。当我重新编码时,我没有得到相同的字符串。我错过了什么?


String base64 = "R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edf";

byte[] decoded = Base64.getDecoder().decode(base64.getBytes());

String encoded = Base64.getEncoder().encodeToString(decoded);

您可以看到该字符串encoded与输入字符串不同base64:


R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edc=

http://img3.mukewang.com/61a71e900001f8d812830045.jpg

饮歌长啸
浏览 228回答 1
1回答

守候你守候我

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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java