Suppose I have an Array[Byte]
called cmp
. val cmp = Array[Byte](120, -100)
.
Now, new String(cmp)
gives x�
, and (new String(cmp)).getBytes
gives Array(120, -17, -65, -67)
which isn't equal to the original Array[Byte](120, -100)
. This byte of -100
was part of an Array[Byte]
obtained by compressing some string using Zlib.
Note: These operations were done in Scala's repl.
When you've got arbitrary binary data, never ever try to convert it to a string as if it's actually text data which has been encoded into binary data using a normal encoding such as UTF-8. (Even when you do have text data, always specify the encoding when calling the String
constructor or getBytes()
.) Otherwise it's like trying to load an mp3 into an image editor and complaining when it doesn't look like a proper picture...
Basically, you should probably use base64 for this. There are plenty of base64 encoders around; I like this public domain one as it has a pretty sensible interface. Alternatively, you could use hex - that will be more readable if you want to be able to easily understand the original binary content from the text representation manually, but will take more space (2 characters for each original 1 byte, vs base64's 4 characters for each original 3 bytes).
See more on this question at Stackoverflow