Java 基64编码的有效字符范围
我对以下内容感兴趣:Java 基64编码的有效字符范围,java,regex,base64,apache-commons,Java,Regex,Base64,Apache Commons,我对以下内容感兴趣: 是否有一个字符列表,永远不会作为base 64编码字符串的一部分出现? 例如*。我不确定这是否会发生。如果原始输入实际上有*作为它的一部分,那么编码会有所不同吗?Base64只包含A-Z,A-Z,0-9,+,/和=/code>。 所以不使用的字符列表是:所有可能的字符减去上面提到的字符 出于特殊目的,也可以使用和\ 以下是我能找到的: 它包括以下方便的表格: Table 1: The Base 64 Alphabet Value En
是否有一个字符列表,永远不会作为base 64编码字符串的一部分出现?
例如
*
。我不确定这是否会发生。如果原始输入实际上有*
作为它的一部分,那么编码会有所不同吗?Base64只包含A-Z
,A-Z
,0-9
,+
,/
和=/code>。
所以不使用的字符列表是:所有可能的字符减去上面提到的字符
出于特殊目的,也可以使用
和\
以下是我能找到的:
它包括以下方便的表格:
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
因此,与任何应永远不会出现在Base 64编码中的字符相匹配的正则表达式为:
[^A-Za-z0-9+/=]
然而,正如卡佩斯的回答所指出的,这只是建议。特定的实现可能会选择一组不同的64个字符。(事实上,即使链接的RFC也包含URL和文件名安全编码的替代表,分别用-
和-
替换字符62和63)。因此,我想这确实取决于创建编码的实现。在大多数情况下,您可能对其他答案是安全的,但根据以下情况,您不应该有一个确定的列表:
为基础所需的64个字符选择的字符集的具体选择因实现而异
提到其他字母表,如“URL和文件名安全”基本64字母表,其中+
和/
替换为-
和
有一种使用不同字符的方法。
请记住,关于行分隔符有一些特定于实现的规则,您可以在同一个表中找到这些规则。有些实现甚至允许(并忽略)字母表中没有的字符。
MIME的Base64实现对前62个值使用A–Z、A–Z和0–9
因此,在大多数情况下,您应该只使用字母数字字符。本文中的示例表还显示了“+”和“-”;你不太可能看到“*”
例如,您可以使用转换为Base64,对于“*”这将返回“Kg==”我将查看此页面来计算它。将输入中的*
表示为输出中的*
的概念是奇怪的,表明对输入与输出之间的关系存在严重的概念混淆。当且仅当*
是基本64字符集的成员时,输出中可能会出现*
。。。无论输入内容是什么。/
作为标准的一部分意味着不能将其用于命名文件。另外,为什么不在A
之前先从0
开始呢?为什么要故意使基本系统中的前十个数字不同?我不能回答你的第二个问题,但RFC提供了一种替代编码,它不使用/
和+
,专门设计用于文件名和URL的安全性。@Martineder顺便说一句,更合适的正则表达式是^[a-Za-z0-9+/]+={0,2}$
。是否有任何python函数可以返回编码的值?例如,base64('A')=0,base64('O')=14