javax.xml.bind的Base64编码器/解码器吃掉字符串的最后两个字符

tsm*_*tsm 3 java base64 encoding decoding

我需要使用Base64编码转换一些字符串,并且很高兴看到我不必滚动我自己的转换器 - Java提供了一个javax.xml.bind.DataConverter.但是,它有一些问题.这是我使用Jython REPL的时间输出:

>>> import javax.xml.bind.DatatypeConverter as DC
>>> import java.lang.String as String
>>> def foo(text):
...   return DC.printBase64Binary(DC.parseBase64Binary(String(text)))
... 
>>> foo("hello")
'hell'
>>> foo("This, it's a punctuated sentence.")
'Thisitsapunctuatedsenten'
>>> foo("\"foo\" \"bar\"")
'foob'
>>> foo("\"foo\" \"bar\"12")
'foobar12'
>>> foo("\"foo\" \"bar\"1")
'foob'
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它根本不处理非字母数字字符,并且经常 - 但不总是 - 将字符串截断两个字符.

我想这可能是时候编写我自己的类了,但是现在我很烦恼a)我没有读取javadoc或其他东西b)该类没有按预期工作.

所以任何帮助都非常感谢; 提前致谢.

Aar*_*lla 12

hello不是base64字符串,因此解析失败.您必须将字符串转换为字节数组(尝试String(text).getBytes('UTF-8')),然后调用DC.printBase64Binary()字节数组以获取Base64中的数据.

DC.parseBase64Binary() 然后将此Base64编码数据转换回字节数组(然后您可以将其转换回字符串).


Dra*_*kić 6

花了一些时间解决GAE平台上的类似问题后的一些发现(Base64解码器在从facebook解码base64-string时吃掉最后两个字符)

如果编码的字符串长度不是4*n,则该方法DatatypeConverter.parseBase64Binary可能会删除一些尾随字符(使JSON有效负载在语法上错误).我的解决方案是添加以下代码:

while (payload.length() % 4 != 0) payload += "=";
Run Code Online (Sandbox Code Playgroud)

关于问题中的代码示例,我建议更改测试字符串首先被编码然后解码,即:

return DC.parseBase64Binary(DC.printBase64Binary(String(text).getBytes()))
Run Code Online (Sandbox Code Playgroud)