Seguinte: eu gravo os bytes de uma imagem em um campo mediumblob do banco de dados. Até aí ok. No meu webservice eu resgato esse campo e coloco em um json, que será a resposta de uma chama. O cliente que receber o json vai receber uma string, mas, que na verdade o seu conteudo é o array de bytes da imagem. Como eu transformo essa string em um array de bytes? sendo que o conteúdo da string já é o array de bytes, ou seja, eu não posso usar o metodo getBytes().
Essa classe possue dois métodos para efetuar a conversão da String de hexas para vetor de bytes e de vetor de bytes para String.
Leia os comentários com bastante atenção para entender o que foi feito, especialmente no método que converte a String em vetor de bytes, que mostra uma sutileza no tratamento de bytes.
importjava.util.Arrays;publicclassConverter{staticchar[]hexaChars=newchar[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};publicstaticvoidmain(String[]args){byte[]vector=newbyte[]{(byte)0x01,(byte)0xAB,(byte)0xFF};Stringstr=byteToStringHexa(vector);System.out.println(str);byte[]vector2=StringHexaToByte(str);for(byteb:vector2)System.out.println(b);}/* * Transforma um vetor de bytes em uma String. Cada byte do vetor * é convertido em uma sequência de dois caracteres, onde o primeiro * caracter corresponde aos primeiros 4 bits (nibble) do byte em questão * e o segundo caracter corresponde aos 4 bits seguintes. */publicstaticStringbyteToStringHexa(byte[]vector){StringBuilderstringBuilder=newStringBuilder();for(byteb:vector){// Isso deve ser feito porque os bytes em Java são tratados como números que // vão de -128 à 127intunsignedByte=b&0xFF;// Concatena o primeiro nibble do byte ao StringBufferstringBuilder.append(hexaChars[unsignedByte/16]);// Concatena o segundo nibble do byte ao StringBufferstringBuilder.append(hexaChars[unsignedByte%16]);}returnstringBuilder.toString();}/* * Transforma String que representa números em hexa para vetor de bytes. */publicstaticbyte[]StringHexaToByte(Stringstring){StringBuilderstringBuilder=newStringBuilder(string);byte[]byteVector=newbyte[stringBuilder.length()/2];for(intindex=0;index<stringBuilder.length();index+=2){// Pega o primeiro nibble do byte que será construídocharc1=stringBuilder.charAt(index);// Pega o segundo nibble do byte que será construídocharc2=stringBuilder.charAt(index+1);// Procura o índice de hexaChars que contém c1bytenibble1=(byte)Arrays.binarySearch(hexaChars,c1);// Procura o índice de hexaChars que contém c2bytenibble2=(byte)Arrays.binarySearch(hexaChars,c2);// Junta os nibbles para formar o byte. Multiplicar um número// por 16 é o mesmo que deslocar 4 bits do número para a esquerdabyteVector[index/2]=(byte)(nibble1*16+nibble2);}// Retorna o vetor de bytes construído a partir da String. Lembre-se que // em Java, bytes possuem sinal, por tanto, 0xFF, por exemplo, aparece como// -1 no vetor. Para converter isso para FF, basta usar uma máscara de bits// adequada e jogar o valor em uma variável inteiraa.// byte b = 0xFF; // Em b está armazenado -1, já que byte é um signed type// int bb = b & 0xFF // bb agora armazena 255, que equivale a 0xFFreturnbyteVector;}}
V
ViniGodoy
Só cuidado ao utilizar o método do matheus para usar o mesmo encoding nos dois lados da transmissão.
S
Schoker
Opa, deu certo!!!
Usei o link que você me passou Vini. Funcionou perfeito!