ilovecomputer66 发表于 2022-7-31 11:19

Android的Base64方法,传的flag11情况下,如何写JDK代码,能使其生成结果一致?

首先请大佬们看下,网上这个文章是不是写的非常不负责任?完全不提安卓的Base64.encodeToString(byte[] byteArray, int flag) 有flag这个参数,拿默认参数,就以偏概全得出他所谓的结论
https://blog.csdn.net/wgw335363240/article/details/120219475


言归正传,
我看到安卓Base64中源码这样

public class Base64 {
    public static final int CRLF = 4;
    public static final int DEFAULT = 0;
    public static final int NO_CLOSE = 16;
    public static final int NO_PADDING = 1;
    public static final int NO_WRAP = 2;
    public static final int URL_SAFE = 8;

然后我看到别人写的,有直接flag传11的
根据以往我编程经验, flag一般可以拿多个 进行或( | ) 运算
这个11,我认为是 1 | 2 | 8 他三个或的结果正好是 11所以,应该是 NO_PADDING | NO_WRAP | URL_SAFE ,同时设置了这三个参数

但我看JDK 的Base64中没有这个参数属性。那么我该怎么让JDK的 去 和 安卓的结果一致呢?
同样一个String json ="{\"name\":\"张三\",\"age\":15,\"province\":\"北京市\"}";安卓执行结果(flag11)是:eyJuYW1lIjoi5byg5LiJIiwiYWdlIjoxNSwicHJvdmluY2UiOiLljJfkuqzluIIifQJDK是:eyJuYW1lIjoi5byg5LiJIiwiYWdlIjoxNSwicHJvdmluY2UiOiLljJfkuqzluIIifQ==
换其他字符串,每次结果并不是都多出2个==,可能1个,等等不同情况(请不要灌水回复,去掉最后的==或=就对。因为base64本来自己最后就可能最后为=)

三滑稽甲苯 发表于 2022-7-31 11:26

直接但不优雅的办法就是截取字符串把后面的=删掉{:301_998:}

ilovecomputer66 发表于 2022-7-31 11:30

三滑稽甲苯 发表于 2022-7-31 11:26
直接但不优雅的办法就是截取字符串把后面的=删掉
我都说了。这样做是错的啊。人家本来最后也能就是=,然后被安卓的多加了==。你咋知道要去掉几个=呢?去多了不就错了

三滑稽甲苯 发表于 2022-7-31 11:31

ilovecomputer66 发表于 2022-7-31 11:30
我都说了。这样做是错的啊
加个计算=的个数就好了,没有=就跳过,base64的=作用是补全4位

ilovecomputer66 发表于 2022-7-31 11:32

三滑稽甲苯 发表于 2022-7-31 11:31
加个计算=的个数就好了,base64的=作用是补全4位

兄弟一个是,base64中,最后结果字符串,一定是4的倍数,然后最后不足4位,才补的=是这个意思么

ilovecomputer66 发表于 2022-7-31 11:36

ilovecomputer66 发表于 2022-7-31 11:32
兄弟一个是,base64中,最后结果字符串,一定是4的倍数,然后最后不足4位,才补的=是这个意思么

应该不是我刚才理解的这样哎。测了几个例子,有的符合,有的不符合

还请 三滑稽甲苯 兄弟指点了

ilovecomputer66 发表于 2022-7-31 11:47

三滑稽甲苯 发表于 2022-7-31 11:31
加个计算=的个数就好了,没有=就跳过,base64的=作用是补全4位

我好像找到办法了

String result = Base64.getEncoder().withoutPadding().encodeToString(byteArray);

应该是这样设置JDK也进行 np padding。就一样了

三滑稽甲苯 发表于 2022-7-31 11:49

ilovecomputer66 发表于 2022-7-31 11:36
应该不是我刚才理解的这样哎。测了几个例子,有的符合,有的不符合

还请 三滑稽甲苯 兄弟指点了
看[百度百科的解释](https://baike.baidu.com/item/BASE64/8545775)
> 如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

简而言之就是不足的补全,具体是几位我也忘了

ilovecomputer66 发表于 2022-7-31 11:54

三滑稽甲苯 发表于 2022-7-31 11:49
看[百度百科的解释](https://baike.baidu.com/item/BASE64/8545775)
> 如果最后剩下两个输入数据, ...

嗯嗯,我上面找到JDK设置的办法了

侃遍天下无二人 发表于 2022-7-31 13:28

先了解了解 NO_PADDING | NO_WRAP 都是干啥的,不用百度,直接看IDEA里的代码提示就行
页: [1] 2
查看完整版本: Android的Base64方法,传的flag11情况下,如何写JDK代码,能使其生成结果一致?