java中的base64url

时间:2011-04-12 20:32:23

标签: java base64

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

讨论base64Url - Decode


存在已修改的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;
}

它返回一组非常小的字符,这些字符甚至与预期结果不相似。 任何想法?

11 个答案:

答案 0 :(得分:49)

Java8 +

import java.util.Base64;


return Base64.getUrlEncoder().encodeToString(bytes);

答案 1 :(得分:22)

使用来自Apache Commons的Base64,可以将其配置为URL安全,我创建了以下功能:

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安全。

答案 2 :(得分:20)

Base64编码是自Java 8以来JDK的一部分。也支持URL安全编码。

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

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

答案 3 :(得分:6)

答案 4 :(得分: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);
}

答案 5 :(得分:5)

在Android SDK中,Base64类中有一个专用标志:Base64.URL_SAFE,使用它来解码为字符串:

import android.util.Base64;
byte[] byteData = Base64.decode(body, Base64.URL_SAFE);
str = new String(byteData, "UTF-8");

答案 6 :(得分:3)

马上,看起来replace()向后;该方法用第二个字符替换第一个字符的出现,而不是相反。

答案 7 :(得分:2)

@ ufk的答案有效,但在解码时实际上并不需要设置urlSafe标志。

  

urlSafe is only applied to encode operations. Decoding seamlessly handles both modes.

此外,还有一些静态助手使其更短更明确:

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

文档

答案 8 :(得分:0)

此类可以帮助您:

public void ReadWrite()
{           
    while (true)
    {
        var command = "";
        if (command == "Exit")
            break;

        var received = Read();
        if(received == null)
            break;

        if (_form.lst_BarcodeScan.InvokeRequired)
        {
        _form.lst_BarcodeScan.Invoke(new MethodInvoker(delegate { _form.lst_BarcodeScan.Items.Add(received + Environment.NewLine); }));
        }
    }

    CloseConnection();
}

答案 9 :(得分:0)

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

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

答案 10 :(得分:-1)

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