44

https://web.archive.org/web/20110422225659/https://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;
}

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

4

11 に答える 11

45

Java 8 以降、 Base64エンコーディングは JDK の一部です。URL セーフ エンコーディングjava.util.Base64.getUrlEncoder()でもサポートされており=、追加でjava.util.Base64.Encoder.withoutPadding( )メソッド:

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

public String encode(String raw) {
    return Base64.getUrlEncoder()
            .withoutPadding()
            .encodeToString(raw.getBytes(StandardCharsets.UTF_8));
}
于 2015-03-27T09:29:44.873 に答える
24

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

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 セーフにします。

于 2011-04-12T21:23:47.513 に答える
6

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

import android.util.Base64;
byte[] byteData = Base64.decode(body, Base64.URL_SAFE);
str = new String(byteData, "UTF-8");
于 2016-03-05T11:17:03.407 に答える
6

Guava に Base64 デコードが組み込まれました。

https://google.github.io/guava/releases/17.0/api/docs/com/google/common/io/BaseEncoding.html

于 2012-12-17T19:10:25.393 に答える
5
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);
}
于 2012-03-04T22:55:23.100 に答える
3

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

于 2011-04-12T20:39:30.350 に答える
2

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

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

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

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));
}

ドキュメント

于 2013-11-04T19:41:31.743 に答える