在base64编码时删除结尾的“=”

我注意到,无论何时我base64编码一个string,在末尾附加“=”。 我可以删除这个字符,然后通过加回来可靠地解码它,或者这是危险的吗? 换句话说,“=”是总是附加的,还是只在某些情况下?

我希望我的编码string尽可能短,这就是为什么我想知道是否可以始终删除“=”字符,并在解码之前将其添加回来。

谢谢

=是填充。

维基百科说

分配一个附加的填充字符,可以用来强制编码的输出为4个字符的整数倍(或者等同于未编码的二进制文本不是3字节的倍数时)。 这些填充字符在解码时必须被丢弃,但仍然允许计算未编码文本的有效长度,当其input二进制长度不是3字节的倍数时(最后一个非填充字符通常被编码,使得最后一个它表示的6位块将在其最低有效位上填零,最多两个填充字符可能出现在编码stream的末尾)。

如果您控制另一端,则可以在传输时将其删除,然后在解码之前重新插入(通过检查string长度)。
请注意,数据在传输过程中将不是有效的Base64。

我写了一部分Apache的commons-codec-1.4.jar Base64解码器,在这个逻辑中,我们没有填充字符。 文件结束和数据stream结束是指示Base64消息完成任何数量的'='字符的指标!

我们在commons-codec-1.4中引入的URL安全变体省略了填充字符,目的是为了保持更小!

http://commons.apache.org/codec/apidocs/src-html/org/apache/commons/codec/binary/Base64.html#line.478

我想一个更安全的答案是,“取决于你的解码器的实现”,但从逻辑上说,写一个不需要填充的解码器并不难。

在JavaScript中你可以做这样的事情:

 // if this is your Base64 encoded string var str = 'VGhpcyBpcyBhbiBhd2Vzb21lIHNjcmlwdA=='; // make URL friendly: str = str.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, ''); // reverse to original encoding if (str.length % 4 != 0) str += ('===').slice(0, 4 - (str.length % 4)); str = str.replace(/-/g, '+').replace(/_/g, '/'); 

另见这个小提琴: http : //jsfiddle.net/7bjaT/66/

=添加填充。 base64string的长度应该是4的倍数,所以根据需要添加1或2 =

阅读:不,你不应该删除它。

在Android上我使用这个:

全球

 String CHARSET_NAME ="UTF-8"; 

编码

 String base64 = new String( Base64.encode(byteArray, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_CLOSE | Base64.NO_WRAP), CHARSET_NAME); return base64.trim(); 

解码

 byte[] bytes = Base64.decode(base64String, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_CLOSE | Base64.NO_WRAP); 

在Java上等于这个:

编码

 private static String base64UrlEncode(byte[] input) { Base64 encoder = new Base64(true); byte[] encodedBytes = encoder.encode(input); return StringUtils.newStringUtf8(encodedBytes).trim(); } 

解码

 private static byte[] base64UrlDecode(String input) { byte[] originalValue = StringUtils.getBytesUtf8(input); Base64 decoder = new Base64(true); return decoder.decode(originalValue); } 

我从来没有跟踪“=”的问题,我也使用Bouncycastle