【问题标题】:How can I make a String Base64 Url Safe Java/Android?如何使字符串 Base64 Url 安全 Java/Android?
【发布时间】: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_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);

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

【问题讨论】:

  • 您将某些内容编码到 b64 中,然后将其解码回来 - 按预期工作。但是您已经对输入进行了编码,您应该使用 url-unsafe decoded 对其进行解码,然后使用 url-safe 编码器对真正的“纯文本”进行编码。
  • 你为什么要对已经编码的字符串进行 Base64 编码?由于输入已经经过 Base64 编码,您首先对其进行解码,然后使用您想要的选项对其进行重新编码。翻转对encode()decode() 的调用,不要将中间的byte[] 转换为字符串。

标签: java android base64


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多