Eu estou tentando entender um byte [] para string, representação de string da conversão de byte [] para byte [] ... Eu converto meu byte [] em uma string para enviar e espero meu serviço da Web (escrito em python) para fazer eco dos dados diretamente para o cliente.
Quando envio os dados do meu aplicativo Java ...
Arrays.toString(data.toByteArray())
Bytes para enviar ..
[B@405217f8
Enviar (este é o resultado de Arrays.toString (), que deve ser uma representação de seqüência de caracteres dos meus dados de bytes, esses 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 retorna uma string para o chamador (que eu vejo é o mesmo que a string que 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 uma string) se parece com
[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]
Não consigo descobrir como recuperar a string recebida em um byte []
O que quer que eu pareça tentar, acabo recebendo uma matriz de bytes que se parece com 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 ... Tenho certeza de que estou perdendo algo verdadeiramente simples ....
Qualquer ajuda?!
response
na minha resposta, então infelizmente não, não há outra maneira. A melhor maneira seria você receber os bytes como dados brutos (como binários) em vez de uma sequência, ou talvez até como uma sequência Base64, o que exigiria apenas a conversão novamente como um valor base 256 (binário).Isso gera "string legal" para o console.
É muito fácil.
fonte
byte[]
ele está recebendo é representado como umString
; ou seja,"[97, 98, 99]"
não[97, 98, 99]
. Ou seja, sua resposta nem se aplica a essa situação.String
abyte[]
deString
. Eu acho que a exigência questão ébyte[]
aString
debyte[]
.O que eu fiz:
retornar aos clientes:
receber dos clientes:
seus dados serão transferidos neste formato:
fonte
O que
Arrays.toString()
faz é criar uma representação de string de cada byte individual no seu byteArray.Verifique a documentação da API Arrays API
Para converter sua sequência de respostas de volta para a matriz de bytes original, você deve usar
split(",")
algo assim e convertê-la em uma coleção e depois converter cada item individual em um byte para recriar sua matriz de bytes.fonte
É simples converter array de bytes em string e string de volta em array de bytes em java. precisamos saber quando usar 'novo' da maneira certa. Isso pode ser feito da seguinte maneira:
conversão de matriz de bytes para string:
Conversão de string para matriz de bytes:
Para obter mais detalhes, consulte: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html
fonte
O tipo de saída que você está vendo na sua matriz de bytes (
[B@405217f8
) também é uma saída para uma matriz de bytes de comprimento zero (ou sejanew byte[0]
). Parece que essa string é uma referência à matriz e não uma descrição do conteúdo da matriz, como seria de esperar dotoString()
método de uma coleção regular .Como com outros respondentes, eu indicaria os
String
construtores que aceitam umbyte[]
parâmetro para construir uma sequência a partir do conteúdo de uma matriz de bytes. Você deve conseguir ler bytes brutos de um soquete,InputStream
se desejar obter bytes de uma conexão TCP.Se você já leu esses bytes como
String
(usando umInputStreamReader
), a sequência pode ser convertida em bytes usando agetBytes()
função Certifique-se de passar o conjunto de caracteres desejado para o construtor String e asgetBytes()
funções, e isso funcionará apenas se os dados de bytes puderem ser convertidos em caracteres peloInputStreamReader
.Se você deseja lidar com bytes não processados, evite usar essa camada de leitor de fluxo.
fonte
Você não pode apenas enviar os bytes como bytes, ou converter cada byte em um caractere e enviar como uma string? Se você fizer isso, terá no mínimo 85 caracteres na sequência, quando você tiver apenas 11 bytes para enviar. Você pode criar uma representação de string dos bytes, para que seja "[B @ 405217f8", que pode ser facilmente convertido em um objeto
bytes
oubytearray
em Python. Caso contrário, você pode representá-los como uma série de dígitos hexadecimais ("5b42403430353231376638") ocupando 22 caracteres, que podem ser facilmente decodificados no lado do Python usandobinascii.unhexlify()
.fonte
[B@405217f8
é o ID do objeto Java da matriz, não o conteúdo da matriz. O ID do objeto certamente " não pode ser facilmente convertido em um objeto de bytes ou bytes em python". O melhor que você pode fazer em termos de tamanho é converter o byte [] em uma string base64.[JDK8]
Para sequenciar:
Para bytes da matriz:
fonte
Se você deseja converter a string novamente em uma matriz de bytes, precisará usar
String.getBytes()
(ou uma função Python equivalente) e isso permitirá que você imprima a matriz de bytes original.fonte
Use a API de código abaixo para converter bytecode como string em matriz de bytes.
fonte
[JAVA 8]
fonte