web-dev-qa-db-ja.com

base = url in java

http://en.wikipedia.org/wiki/Base64#URL_applications

base64Urlについて話す-デコード


uRLバリアントの修正されたBase64が存在し、パディング「=」は使用されず、標準Base64の「+」および「/」文字はそれぞれ「-」および「_」に置き換えられます。


次の関数を作成しました。

public static String base64UrlDecode(String input) {
    String result = null;
    BASE64Decoder decoder = new BASE64Decoder();
    try {
        result = decoder.decodeBuffer(input.replace('-','+').replace('/','_')).toString();
    }
    catch (IOException e) {
        System.out.println(e.getMessage());
    }
    return result;
}

予想される結果に似ていない非常に小さな文字セットを返します。何か案は?

27
ufk

URLセーフに設定できるApache Commonsの_Base64_を使用して、次の関数を作成しました。

_import org.Apache.commons.codec.binary.Base64;

public static String base64UrlDecode(String input) {
    String result = null;
    Base64 decoder = new Base64(true);
    byte[] decodedBytes = decoder.decode(input);
    result = new String(decodedBytes);
    return result;
}
_

コンストラクタBase64(true)は、デコードURLを安全にします。

22
ufk

Java8 +

import Java.util.Base64;


return Base64.getUrlEncoder().encodeToString(bytes);
56
Boris Treukhov

Base64 エンコーディングはJava 8. URLセーフエンコーディングもサポートされているため、JDKの一部です。

import Java.nio.charset.StandardCharsets;
import Java.util.Base64;

public String encode(String raw) {
    return Base64.getUrlEncoder()
            .withoutPadding()
            .encodeToString(raw.getBytes(StandardCharsets.UTF_8));
}
22
deamon
6
jontro

Android SDKでは、Base64クラス:Base64.URL_SAFE、次のように使用して文字列にデコードします。

import Android.util.Base64;
byte[] byteData = Base64.decode(body, Base64.URL_SAFE);
str = new String(byteData, "UTF-8");
5
Oded Breiner
public static byte[] encodeUrlSafe(byte[] data) {
    byte[] encode = Base64.encode(data);
    for (int i = 0; i < encode.length; i++) {
        if (encode[i] == '+') {
            encode[i] = '-';
        } else if (encode[i] == '/') {
            encode[i] = '_';
        }
    }
    return encode;
}

public static byte[] decodeUrlSafe(byte[] data) {
    byte[] encode = Arrays.copyOf(data, data.length);
    for (int i = 0; i < encode.length; i++) {
        if (encode[i] == '-') {
            encode[i] = '+';
        } else if (encode[i] == '_') {
            encode[i] = '/';
        }
    }
    return Base64.decode(encode);
}
5
user249654

すぐに、あなたのreplace()は後方にあるように見えます。このメソッドは、最初の文字の出現を2番目の文字に置き換えますが、その逆ではありません。

3
Pops

@ufkの答えは機能しますが、実際にデコードしているときにurlSafeフラグを設定する必要はありません。

rlSafeはエンコード操作にのみ適用されます。デコードは両方のモードをシームレスに処理します。

また、より短く、より明確にするための静的ヘルパーがいくつかあります。

import org.Apache.commons.codec.binary.Base64;
import org.Apache.commons.codec.binary.StringUtils;

public static String base64UrlDecode(String input) {
  StringUtils.newStringUtf8(Base64.decodeBase64(input));
}

ドキュメント

2
overthink

このクラスは次のことに役立ちます。

import Android.util.Base64;

public class Encryptor {

    public static String encode(String input) {
        return Base64.encodeToString(input.getBytes(), Base64.URL_SAFE);
    }

    public static String decode(String encoded) {
        return new String(Base64.decode(encoded.getBytes(), Base64.URL_SAFE));
    }
}
0
Hadi Note