如何使字符串Base64 Url安全到Java/Android?

如何使字符串Base64 Url安全到Java/Android?,java,android,base64,Java,Android,Base64,我已经尝试了一段时间,但无论我做什么,我似乎都无法使我的字符串成为Url安全的: Input: XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT+d7yvxw= Desired Output: XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT-d7yvxw 基本上,我想在我的输入字符串上应用一些标志,即Base64.URL\u SAFE,Base64.NO\u PADDING和Base64.NO\u WRAP。然而,当我这样做时: String str = "X

我已经尝试了一段时间,但无论我做什么,我似乎都无法使我的字符串成为Url安全的:

Input: XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT+d7yvxw=
Desired Output: XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT-d7yvxw
基本上,我想在我的输入字符串上应用一些标志,即
Base64.URL\u SAFE
Base64.NO\u PADDING
Base64.NO\u 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()
和其他字符串修改之外,还有什么方法可以获得我想要的输出吗?

您可以使用url编码器来归档您想要的行为:

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

谢谢大家的评论!我已经有了一个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);

是最终对我有效的解决方案。

您将某些内容编码到b64中,然后对其进行解码-正如预期的那样工作。但是您已经对输入进行了编码,您应该使用url对其进行解码,然后对真正的“纯文本”进行编码“使用url安全编码器。为什么要对已编码的字符串进行Base64编码?因为输入已进行Base64编码,所以首先对其进行解码,然后使用所需的选项对其重新编码。将调用翻转到
encode()
decode()
,并且不要转换中间的
字节[]
to/from string。这不太有效,我得到了编码的特殊字符->“XzbeW3jg9NYp6J0w2mTP4NLrTK06p1EDTnNG%2BKYhvyw%3D”哦,我误解了你的问题,我的错。