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;
}
它返回一组非常小的字符,这些字符甚至与预期结果不相似。 任何想法?
答案 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)
Guava现在内置了Base64解码。
https://google.github.io/guava/releases/17.0/api/docs/com/google/common/io/BaseEncoding.html
答案 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);
}
}
答案 10 :(得分:-1)
在Java中,尝试使用Commons Codec库中的方法Base64.encodeBase64URLSafeString()
进行编码。