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]