gpt4 book ai didi

java.util.Base64 解码然后编码产生不同的字符串

转载 作者:搜寻专家 更新时间:2023-11-01 02:36:45 26 4
gpt4 key购买 nike

问题:解码 Fz+= 然后编码返回 Fz8=

以下代码:

new String(Base64.getEncoder().encode(Base64.getDecoder().decode("Fz+=".getBytes("UTF-8"))))

给出以下字符串: Fz8=

+ 是如何变成 8 的?

我一定是漏掉了什么。

Fz+= 位模式:000101 110011 111110 000000

重新排列成 8 位组:00010111 00111111 10000000

十进制:23 63 128

需要 3 个字节来表示它。

然而,当我只尝试这段代码时:

Base64.getDecoder().decode("Fz+=".getBytes("UTF-8"))

我得到以下十进制数组:

 [23, 63]

最后一个字节 (1000 0000) 去了哪里?这就是我们编码时 + 变成 8 的原因。

最佳答案

输入字符串 Fz+= 不是有效的 Base64 编码。

根据定义,如果编码字符串以单个填充字符结尾,则导致该编码四重奏的输入仅包含两个字节。编码时,两字节输入应该用 0x00 填充以构成一个完整的 3 字节单元,然后将其编码为 4 个 Base64 代码字节。

生成字符串 Fz+= 的任何内容都错误地用 0x80 填充了 2 字节输入。或者,编码器将 0x80 误认为是 0x00,可能是因为它需要纯 7 位 ASCII。

无论什么原因,Fz+=输入都是无效的,解码器只是忽略了额外的两位。

如果输入确实是 00010111 00111111 10000000,那么正确的编码是 Fz+A,没有填充,A 代码代表 000000。同样,这可能是由于最初进行编码的错误所致。

关于java.util.Base64 解码然后编码产生不同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com