为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

饮歌长啸 2021-12-01 15:04:22
我正在对 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


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 227 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信