I need to convert some strings using Base64 encoding, and was delighted to see that I didn’t have to roll my own converter–Java provides one with javax.xml.bind.DataConverter. However, it has some problems. Here’s the output of my time with a 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'
As you can see, it doesn’t handle non-alphanumeric characters at all, and also frequently–but not always–truncates the string by two characters.
I guess it might be time to just write my own class, but now I’m bothered that either a) I’m failing at reading the javadoc or something b) The class doesn’t work as expected.
So any help is much appreciated; thanks in advance.
hellois not a base64 String, so the parsing fails. You must convert the string into a byte array (tryString(text).getBytes('UTF-8')) and then callDC.printBase64Binary()on the byte array to get the data in Base64.DC.parseBase64Binary()will then convert this Base64 encoded data back into the byte array (which you can then convert back into a string).