I'estou tentando entender um byte[] a string, representação de string de byte[] a byte[] conversão... Eu converto meu byte[] para uma string para enviar, eu então espero que meu serviço web (escrito em python) ecoe os dados diretamente de volta para o cliente.
Quando eu enviar os dados da minha aplicação Java...
Arrays.toString(data.toByteArray())
Bytes para enviar...
[B@405217f8
Enviar (Este é o resultado de Arrays.toString() que deve ser uma representação em cadeia dos meus dados de bytes, estes dados serão enviados através do fio):
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
No lado python, o servidor python devolve uma string ao chamador (que eu posso ver é a mesma que a string que eu enviei para o servidor
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
O servidor deve retornar esses dados para o cliente, onde podem ser verificados.
A resposta que meu cliente recebe (como um fio) se parece com
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Eu posso'parece que não consigo descobrir como fazer com que o fio recebido volte para um byte[]
O que quer que eu pareça tentar, acabo por ter uma matriz de bytes que parece ser a seguinte...
[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]
ou posso obter uma representação de bytes, que é a seguinte:
B@2a80d889
Ambos são diferentes dos meus dados enviados... I'tenho a certeza que me está a faltar algo verdadeiramente simples....
Alguma ajuda?!
Você pode'não basta pegar a string retornada e construir uma string a partir dela... it'não é mais um byte[]
tipo de dado, it'já é uma string; você precisa analisá-la. Por exemplo :
String response = "[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]"; // response from the Python script
String[] byteValues = response.substring(1, response.length() - 1).split(",");
byte[] bytes = new byte[byteValues.length];
for (int i=0, len=bytes.length; i<len; i++) {
bytes[i] = Byte.parseByte(byteValues[i].trim());
}
String str = new String(bytes);
EDIT*****
Você tem uma dica do seu problema na sua pergunta, onde você diz "O que quer que eu pareça tentar eu acabo recebendo uma matriz de bytes que parece ser a seguinte... [91, 45, ...
", porque 91
é o valor de byte para [
, então [91, 45, ...
é o array de bytes da string "[-45, 1, 16, ...
" string.
O método Arrays.toString()
irá retornar uma representação String
do array especificado; significando que o valor retornado não será mais um array. Por exemplo :
byte[] b1 = new byte[] {97, 98, 99};
String s1 = Arrays.toString(b1);
String s2 = new String(b1);
System.out.println(s1); // -> "[97, 98, 99]"
System.out.println(s2); // -> "abc";
Como você pode ver, s1
contém a representação de string do array b1
, enquanto s2
contém a representação de string dos **bytes*** contidos em b1
.
Agora, em seu problema, seu servidor retorna uma string similar a s1
, portanto para obter a representação de array de volta, você precisa do método oposto do construtor. Se s2.getBytes()
é o oposto de new String(b1)
, você precisa encontrar o oposto de Arrays.toString(b1)
, assim o código que eu colei no primeiro trecho desta resposta.
O que o Arrays.toString()
faz é criar uma representação em string de cada byte individual em seu byteArray.
Consulte a documentação da API Arrays API
Para converter sua string de resposta para a matriz de bytes original, você tem que utilizar split(",")
ou algo assim e convertê-la em uma coleção e então converter cada item individual ali dentro em um byte para recriar sua matriz de bytes.
Você não pode simplesmente enviar os bytes como bytes, ou converter cada byte em um personagem e enviar como uma string? Fazendo isso como você é, você irá ocupar um mínimo de 85 caracteres na string, quando você tem apenas 11 bytes para enviar. Você poderia criar uma representação de string dos bytes, então it'd be "[B@405217f8", que pode ser facilmente convertido para um objeto bytes
ou bytearray
em Python. Caso contrário, você poderia representá-los como uma série de dígitos hexadecimais ("5b42403430353231376638") assumindo 22 caracteres, que poderiam ser facilmente decodificados no lado Python utilizando binascii.unhexlify()
.