gpt4 book ai didi

java - 将字节数组解码为 Base64 时出错,其中包含 '-' 和 '_' 等字符

转载 作者:太空宇宙 更新时间:2023-11-04 10:08:38 25 4
gpt4 key购买 nike

我正在尝试对字节数组进行 Base64 解码,只要我的字节数组不包含“-”或“_”等任何字符,一切都运行正常。但每当字节数组包含 '-' 时,我就会得到一个异常

java.lang.IllegalArgumentException: Illegal base64 character 2d
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)

当字节数组包含'_'时,异常(exception)

java.lang.IllegalArgumentException: Illegal base64 character 5f
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)

即字符 2d 到 5f 之后的代码差异。这些代码是什么。无论代码中的这些字符如何,我如何解码任何值?

这是我的代码片段:

import java.util.Properties;
import java.util.Base64;
import java.io.*;
...

public class BasicSample {

public static void main(String[] args) {
byte[] encoded = res.getBytes("s_id");
System.out.printf("\nInside Byte %s\n",new String(encoded) );
try {
byte[] decoded = Base64.getDecoder().decode(encoded);

System.out.printf("\nDecoded Byte %s\n",new String(decoded, "UTF-8") );
} catch(Exception e) {
e.printStackTrace();
}
}

}

最佳答案

解决方案

'-' 替换为 '+',将 '_' 替换为 '/',如下行所示

byte[] decoded = Base64.getDecoder().decode(encoded.replace('-', '+').replace('_', '/'));

基本原理

Base64 编码和 Base64url 编码。除了上面指出的两个字符替换之外,它们完全相同。

查看 RFC 4648 中的表 1 和表 2 :

                Table 1: The Base 64 Alphabet

Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y

[...]

Table 2: The "URL and Filename safe" Base 64 Alphabet

Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 - (minus)
12 M 29 d 46 u 63 _
13 N 30 e 47 v (underline)
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y (pad) =

这是来自 RFC 的另一段引用:

This encoding may be referred to as "base64url". This encodingshould not be regarded as the same as the "base64" encoding andshould not be referred to as only "base64". Unless clarifiedotherwise, "base64" refers to the base 64 in the previous section.This encoding is technically identical to the previous one, exceptfor the 62:nd and 63:rd alphabet character, as indicated in Table 2.

关于java - 将字节数组解码为 Base64 时出错,其中包含 '-' 和 '_' 等字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52625704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com