[RESOLVIDO] - Bytes to String

Bom dia pessoal,

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().

Desde já agradeço!

Você deve codificar os bytes num formato de texto, como o Base64.

Existe um pacote da apache que faz essa conversão: http://commons.apache.org/codec/

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.

[code]import java.util.Arrays;

public class Converter {
static char[] hexaChars = new char[]{‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’};
public static void main(String[] args) {
byte[] vector = new byte[]{(byte)0x01, (byte)0xAB, (byte)0xFF};
String str = byteToStringHexa(vector);
System.out.println(str);
byte[] vector2 = StringHexaToByte(str);
for(byte b : 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.
 */
public static String byteToStringHexa(byte[] vector)
{
	StringBuilder stringBuilder = new StringBuilder();
	for(byte b : vector)
	{
		// Isso deve ser feito porque os bytes em Java são tratados como números que 
		// vão de -128 à 127
		int unsignedByte = b & 0xFF;
		// Concatena o primeiro nibble do byte ao StringBuffer
		stringBuilder.append(hexaChars[unsignedByte / 16]);
		// Concatena o segundo nibble do byte ao StringBuffer
		stringBuilder.append(hexaChars[unsignedByte % 16]);
	}
	return stringBuilder.toString();
}
/*
 * Transforma String que representa números em hexa para vetor de bytes.
 */
public static byte[] StringHexaToByte(String string)
{
	StringBuilder stringBuilder = new StringBuilder(string);
	
	byte[] byteVector = new byte[stringBuilder.length() / 2];
	for(int index = 0; index < stringBuilder.length(); index += 2)
	{
		// Pega o primeiro nibble do byte que será construído
		char c1 = stringBuilder.charAt(index);
		// Pega o segundo nibble do byte que será construído
		char c2 = stringBuilder.charAt(index + 1);
		// Procura o índice de hexaChars que contém c1
		byte nibble1 = (byte) Arrays.binarySearch(hexaChars, c1);
		// Procura o índice de hexaChars que contém c2
		byte nibble2 = (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 esquerda
		byteVector[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 0xFF
	return byteVector;
}

}

[/code]

Só cuidado ao utilizar o método do matheus para usar o mesmo encoding nos dois lados da transmissão.

Opa, deu certo!!!

Usei o link que você me passou Vini. Funcionou perfeito!

Obrigado!!!