[RESOLVIDO] - Bytes to String

4 respostas
S

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!

4 Respostas

V

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/

M

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.

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;
	}
}
V

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

S

Opa, deu certo!!!

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

Obrigado!!!

Criado 10 de novembro de 2012
Ultima resposta 16 de nov. de 2012
Respostas 4
Participantes 3