I'm trying to understand a byte[] to string, string representation of byte[] to byte[] conversion... I convert my byte[] to a string to send, I then expect my web service (written in python) to echo the data straight back to the client.
When I send the data from my Java application...
Arrays.toString(data.toByteArray())
Bytes to send..
[B@405217f8
Send (This is the result of Arrays.toString() which should be a string representation of my byte data, this data will be sent across the wire):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
On the python side, the python server returns a string to the caller (which I can see is the same as the string I sent to the server
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
The server should return this data to the client, where it can be verified.
The response my client receives (as a string) looks like
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
I can't seem to figure out how to get the received string back into a byte[]
Whatever I seem to try I end up getting a byte array which looks as follows...
[91, 45, 52, 55, 44, 32, 49, 44, 32, 49, 54, 44, 32, 56, 52, 44, 32, 50, 44, 32, 49, 48, 49, 44, 32, 49, 49, 48, 44, 32, 56, 51, 44, 32, 49, 49, 49, 44, 32, 49, 48, 57, 44, 32, 49, 48, 49, 44, 32, 51, 50, 44, 32, 55, 56, 44, 32, 55, 48, 44, 32, 54, 55, 44, 32, 51, 50, 44, 32, 54, 56, 44, 32, 57, 55, 44, 32, 49, 49, 54, 44, 32, 57, 55, 93]
or I can get a byte representation which is as follows:
B@2a80d889
Both of these are different from my sent data... I'm sure Im missing something truly simple....
Any help?!
You can't just take the returned string and construct a string from it... it's not a
byte[]
data type anymore, it's already a string; you need to parse it. For example :** EDIT **
You get an hint of your problem in your question, where you say "
Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ...
", because91
is the byte value for[
, so[91, 45, ...
is the byte array of the string "[-45, 1, 16, ...
" string.The method
Arrays.toString()
will return aString
representation of the specified array; meaning that the returned value will not be a array anymore. For example :As you can see,
s1
holds the string representation of the arrayb1
, whiles2
holds the string representation of the bytes contained inb1
.Now, in your problem, your server returns a string similar to
s1
, therefore to get the array representation back, you need the opposite constructor method. Ifs2.getBytes()
is the opposite ofnew String(b1)
, you need to find the opposite ofArrays.toString(b1)
, thus the code I pasted in the first snippet of this answer.Use the below code API to convert bytecode as string to Byte array.
[JDK8]
To string:
To byte array:
What
Arrays.toString()
does is create a string representation of each individual byte in your byteArray.Please check the API documentation Arrays API
To convert your response string back to the original byte array, you have to use
split(",")
or something and convert it into a collection and then convert each individual item in there to a byte to recreate your byte array.Can you not just send the bytes as bytes, or convert each byte to a character and send as a string? Doing it like you are will take up a minimum of 85 characters in the string, when you only have 11 bytes to send. You could create a string representation of the bytes, so it'd be "[B@405217f8", which can easily be converted to a
bytes
orbytearray
object in Python. Failing that, you could represent them as a series of hexadecimal digits ("5b42403430353231376638") taking up 22 characters, which could be easily decoded on the Python side usingbinascii.unhexlify()
.That outputs "cool string" to the console.
It's pretty darn easy.