【发布时间】:2017-11-06 10:24:43
【问题描述】:
我已经尝试了一段时间,但无论我做什么,我似乎都无法让我的字符串成为 Url Safe:
Input: XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT+d7yvxw=
Desired Output: XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT-d7yvxw
本质上,我想在来自https://developer.android.com/reference/android/util/Base64.html 的输入字符串上应用一些标志,即Base64.URL_SAFE、Base64.NO_PADDING 和Base64.NO_WRAP。但是,当我这样做时:
String str = "XzbeW3jg9NYp6J0w2mTP4NLrTK06p1EDTnNG+KYhvyw=";
byte[] encoded = Base64.encode(
str.getBytes(), Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP);
byte[] strBytes = Base64.decode(encoded, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP);
String decoded = new String(strBytes);
//outputs original str "XzbeW3jg9NYp6J0w2mTP4NLrTK06p1EDTnNG+KYhvyw="
System.out.println(decoded);
我不确定为什么 url 安全编码在这里不起作用,我做错了什么吗?有没有办法可以获得我想要的输出(除了手动执行 String.replace() 和其他字符串修改?
【问题讨论】:
-
您将某些内容编码到 b64 中,然后将其解码回来 - 按预期工作。但是您已经对输入进行了编码,您应该使用 url-unsafe decoded 对其进行解码,然后使用 url-safe 编码器对真正的“纯文本”进行编码。
-
你为什么要对已经编码的字符串进行 Base64 编码?由于输入已经经过 Base64 编码,您首先对其进行解码,然后使用您想要的选项对其进行重新编码。翻转对
encode()和decode()的调用,不要将中间的byte[]转换为字符串。