2011-12-28 16 views
22

Tengo una matriz String. Quiero convertirlo a matriz de bytes. Uso el programa Java. Por ejemplo:Cómo convertir una cadena en byte en Java

String str[] = {"aa", "55"}; 

convertido a:

byte new[] = {(byte)0xaa, (byte)0x55}; 

¿Qué puedo hacer yo?

+1

Ver http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a-hex-dump-to-a-byte -array-using-java – rafraf

+1

'byte n [] = str.getBytes()' hará la tarea. Sin embargo, obtendrá un error en 'new' ya que es una palabra clave y no puede usarse como identificador. – backslashN

Respuesta

14

En cuanto a la muestra que supongo que quiere decir que una matriz de cadenas es en realidad un conjunto de representación hexadecimal de bytes, ¿verdad?

Si es así, para cada elemento de cadena que haría lo siguiente:

  1. cheque que una cadena se compone sólo de 2 caracteres
  2. estos caracteres están en '0' .. '9' o ' a' .. 'f' intervalo (llevar su caso en cuenta también)
  3. convertir cada carácter a un número correspondiente, restando valor de código de '0' o 'a
  4. construir un valor de' bytes, donde primer char es bits más altos y segundo char es los bits más bajos. P.ej.

    int byteVal = (firstCharNumber << 4) | secondCharNumber; 
    
8

Puede probar algo similar a esto:

String s = "65"; 

byte value = Byte.valueOf(s); 

Utilice el método Byte.ValueOf() para todos los elementos de la matriz de cuerdas para convertirlos en valores de byte.

+7

No funciona. java.lang.NumberFormatException: no se puede analizar 'aa' como entero – brian

+0

Eso significa que era una cadena vacía –

11

cadena Convertir a Byte-Array:

byte[] theByteArray = stringToConvert.getBytes(); 

Cadena Convertir a Byte:

String str = "aa"; 

byte b = Byte.valueOf(str); 
+2

me da 'NumberFormatException' cuando ingrese un valor de' A' a 'F' –

2
String source = "testString"; 
byte[] byteArray = source.getBytes(encoding); 

Puede foreach y hacer lo mismo con todas las cadenas de la matriz.

+0

Mi media es change (String)" aa "a (byte) 0xaa, pero no a (byte) 0x97, (byte) 0x97 – brian

53
String str = "Your string"; 

byte[] array = str.getBytes(); 
+3

Especifique siempre un conjunto de caracteres específico como' UTF-8' a menos que el conjunto de caracteres dependiente de la plataforma predeterminada sea adecuado (lo cual es indeseable en la mayoría de los casos) utilizando una de las versiones sobrecargadas de ese método, como 'String # getBytes (Charset charset)' o 'String # getBytes (String charsetName)'. – Tiny

+0

byte [] array = str.getBytes ("UTF-8"); throws UnsupportedEncodingException – daddygames

3

un largo camino por recorrer :).No estoy al tanto de los métodos para deshacerse de largos for declaraciones

ArrayList<Byte> bList = new ArrayList<Byte>(); 
for(String ss : str) { 
    byte[] bArr = ss.getBytes(); 
    for(Byte b : bArr) { 
     bList.add(b); 
    } 
} 
//if you still need an array 
byte[] bArr = new byte[bList.size()]; 
for(int i=0; i<bList.size(); i++) { 
    bArr[i] = bList.get(i); 
} 
0

La forma más sencilla (utilizando Apache Commons Codec):

byte[] bytes = Hex.decodeHex(str.toCharArray()); 
3

Como no había respuesta para cadena hexadecimal de un solo byte conversión, aquí es mío: uso

private static byte hexStringToByte(String data) { 
    return (byte) ((Character.digit(data.charAt(0), 16) << 4) 
        | Character.digit(data.charAt(1), 16)); 
} 

muestra:

hexStringToByte("aa"); // 170 
hexStringToByte("ff"); // 255 
hexStringToByte("10"); // 16 

O también puede probar el Integer.parseInt(String number, int radix) imo, es mucho mejor que otros.

// first parameter is a number represented in string 
// second is the radix or the base number system to be use 
Integer.parseInt("de", 16); // 222 
Integer.parseInt("ad", 16); // 173 
Integer.parseInt("c9", 16); // 201 
+0

Este es el mejor método para mí – doraemon

0
String str[] = {"aa", "55"}; 

byte b[] = new byte[str.length]; 

for (int i = 0; i < str.length; i++) { 
    b[i] = (byte) Integer.parseInt(str[i], 16); 
} 

Integer.parseInt (cadena, radix) convierte una cadena en un entero, el parametro radix especifica el sistema de numeración.

Use una base de 16 si la cadena representa un número hexadecimal.
Use una base de 2 si la cadena representa un número binario.
Utilice una raíz de 10 (u omita el parámetro de base) si la cadena representa un número decimal.

Para más detalles, compruebe la documentación de Java: https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int)

+1

Las respuestas de solo código no explican por qué funciona el código: por favor agregue una explicación para los visitantes futuros de lo que hizo para resolver el problema. –

Cuestiones relacionadas