Java 为什么Base64.decode为不同的字符串生成相同的字节数组?

Java 为什么Base64.decode为不同的字符串生成相同的字节数组?,java,encoding,base64,decoding,Java,Encoding,Base64,Decoding,我使用URL安全的Base64编码对随机生成的字节数组进行编码。但我在解码上有个问题。当我解码两个不同的字符串(除了最后一个字符外,其他所有字符都相同)时,它会生成相同的字节数组。例如,对于“dGVzdCBzdHJpbmr”和“dGVzdCBzdHJpbmq”字符串,结果是相同的: Array(116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 106) 对于编码/解码,我以这种方式使用java.util.Base64: // encoding..

我使用URL安全的Base64编码对随机生成的字节数组进行编码。但我在解码上有个问题。当我解码两个不同的字符串(除了最后一个字符外,其他所有字符都相同)时,它会生成相同的字节数组。例如,对于
“dGVzdCBzdHJpbmr”
“dGVzdCBzdHJpbmq”
字符串,结果是相同的:

Array(116, 101, 115, 116, 32, 115, 116, 114, 105, 110, 106)
对于编码/解码,我以这种方式使用
java.util.Base64

// encoding...
Base64.getUrlEncoder().withoutPadding().encodeToString(myString.getBytes())
// decoding...
Base64.getUrlDecoder().decode(base64String)

这次碰撞的原因是什么?除了最后一个字符外,还有其他字符吗?我如何解决这个问题并进行解码,以便为每个不同的字符串返回不同的字节数组?

可能这就是Base64编码和解码的方式……看看这是否有帮助。
阅读下面的说明以了解Base 64的实际工作情况。如果数组字符串末尾有差异,则编码值将可能反映在同一位置。

您看到的问题是由于“结果”(11字节)中的字节数没有完全“填充”造成的Base64编码字符串的最后一个字符

请记住,Base64将每个8位实体编码为6位字符。结果字符串需要11*8/6字节或14个2/3字符。但是你不能写部分字符。只有前4位(或最后一个字符的2/3)是有效的。最后两位不被解码。因此,所有:

dGVzdCBzdHJpbmo
dGVzdCBzdHJpbmp
dGVzdCBzdHJpbmq
dGVzdCBzdHJpbmr
全部解码为相同的11个字节(
116、101、115、116、32、115、116、114、105、110、106


PS:在没有填充的情况下,一些解码器也会尝试解码“最后一个”字节,您将得到一个12字节的结果(具有不同的最后一个字节)。这就是我发表评论的原因(询问
withoutPadding()
选项是否是个好主意)。但是您的解码器似乎可以处理这个问题。

您显示的数组是“test strinj”的ASCII表示形式(请参阅),似乎不是任何东西的base64表示形式


似乎您正在分析错误的“result”数组

您确定
withoutPadding()
选项是个好主意吗?从根本上说,同一个数组是否可以用两种不同的方式编码并不重要。重要的是,如果你取一个数组,对它进行编码,然后解码,你会得到相同的数组。这并不是说你有两个相同的字符串并不有趣。:-)非常确定的是,这只是在结尾有未使用的位的问题(因为Base64跨字节边界编码八位字节),但我必须计算出这些位来确定。@haraldK我用它来删除结尾的尾随“=”字符。事实上,我尝试了填充,结果是一样的。