44

https://web.archive.org/web/20110422225659/https://en.wikipedia.org/wiki/Base64#URL_applications

谈论 base64Url - 解码


存在修改后的 Base64 for URL 变体,其中不使用填充“=”,标准 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

82

Java8+

import java.util.Base64;


return Base64.getUrlEncoder().encodeToString(bytes);
于 2016-07-09T22:54:02.173 回答
45

从 Java 8 开始, Base64编码是 JDK 的一部分。java.util.Base64.getUrlEncoder()也支持URL 安全编码,并且可以通过另外使用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

使用Base64可以配置为 URL 安全的 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

Guava 现在内置了 Base64 解码。

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

于 2012-12-17T19:10:25.393 回答
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 回答
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()倒退了;该方法用第二个字符替换第一个字符的出现,而不是相反。

于 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 回答
1

这个类可以帮助:

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));
    }
}
于 2019-01-24T17:27:47.060 回答
1

我知道答案已经存在,但是,如果有人想要...

import java.util.Base64; public 

class Base64BasicEncryptionExample {  

    publicstaticvoid main(String[] args) {  

       // Getting encoder  
       Base64.Encoder encoder = Base64.getUrlEncoder();  
       // Encoding URL  
       String eStr = encoder.encodeToString
                               ("http://www.javatpoint.com/javatutorial/".getBytes());  
       System.out.println("Encoded URL: "+eStr);  

       // Getting decoder  
       Base64.Decoder decoder = Base64.getUrlDecoder();  
       // Decoding URl  
       String dStr = new String(decoder.decode(eStr));  
       System.out.println("Decoded URL: "+dStr);  
    }  
}  

获得帮助:https ://www.javatpoint.com/java-base64-encode-decode

于 2021-04-17T02:24:47.883 回答
-1

在 Java 中尝试使用Base64.encodeBase64URLSafeString()Commons Codec 库中的方法进行编码。

于 2015-11-26T14:39:08.303 回答