如何制作String Base64 Url Safe Java / Android?

时间:2017-11-05 16:26:47

标签: java android base64

我已经尝试了一段时间,但无论我做什么,我似乎无法将我的字符串设为Url Safe:

Input: XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT+d7yvxw=
Desired Output: XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT-d7yvxw

基本上我想在https://developer.android.com/reference/android/util/Base64.html的输入字符串上应用一些标记,即Base64.URL_SAFEBase64.NO_PADDINGBase64.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);

我不确定为什么网址安全编码不在这里工作,有什么我做错了吗?有没有办法可以获得我想要的输出(除了手动执行String.replace()和其他字符串修改?

2 个答案:

答案 0 :(得分:4)

感谢大家的评论!我已经有了base64编码的字符串是正确的,我需要首先解码然后重新编码。

byte[] strBytes = Base64.decode(str, Base64.DEFAULT);
byte[] encoded = Base64.encode(
    strBytes, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP);
return new String(encoded);

是最终为我工作的解决方案。

答案 1 :(得分:-1)

您可以使用URLEncoder来实现您想要的行为:

String urlEncoded = URLEncoder.encode(yourBase64String, "UTF-8");