有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

String base64 = "R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edf";
byte[] decoded = Base64.getDecoder().decode(base64.getBytes());
String encoded = Base64.getEncoder().encodeToString(decoded);

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

R3df789GSfsb2edfSFSDFuikuikk2349GSfsb2edfSvFSDFR3df789GSfsb2edc=

enter image description here


共 (1) 个答案

  1. # 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的非标准最后一个块相同的字节