2011-10-30 17 views
37

¿Es posible convertir una cadena en una matriz de bytes y luego convertirla a la cadena original en Java o Android?Convierta una Cadena en una matriz de bytes y luego vuelva a la Cadena original

Mi objetivo es enviar algunas cadenas a un microcontrolador (Arduino) y almacenarlo en EEPROM (que es solo 1   KB). Traté de usar un hash MD5, pero parece que es solo un cifrado de una dirección. ¿Qué puedo hacer para enfrentar este problema?

+0

Intente utilizar SHA128 si' Estamos enviando la cadena a un adruino. Es reversible; pero no sé si necesitarías ese código en el arduino. –

Respuesta

89

se recomienda usar los miembros de la cadena, pero con una codificación explícita:

byte[] bytes = text.getBytes("UTF-8"); 
String text = new String(bytes, "UTF-8"); 

Mediante el uso de una codificación explícita (y uno que es compatible con todos Unicode) a evitar los problemas de sólo llamar text.getBytes() etc:

  • Está utilizando explícitamente una codificación específica, para saber qué codificación utilizar más tarde, en lugar de depender de la plataforma predeterminada.
  • Sabe que admitirá todos los Unicode (en lugar de, digamos, ISO-Latin-1).

EDITAR: Aunque UTF-8 es la codificación predeterminada en Android, definitivamente sería explícito al respecto. Por ejemplo, esta pregunta solo dice "en Java o Android", por lo que es completamente posible que el código termine siendo utilizado en otras plataformas.

Básicamente dado que la plataforma normal de Java puede tener diferentes codificaciones predeterminadas, creo que es mejor ser absolutamente explícito. He visto mucha gente usando la codificación predeterminada y perdiendo datos para correr ese riesgo.

EDIT: En mi prisa me olvidó mencionar que usted no tiene que utilizar el nombre de la codificación - se puede utilizar una vez Charset. El uso de Guava me había realmente uso:

byte[] bytes = text.getBytes(Charsets.UTF_8); 
String text = new String(bytes, Charsets.UTF_8); 
+1

¿No es UTF-8 plataforma Android predeterminada de todos modos? – ewanm89

+1

public static Charset defaultCharset() Desde: API Nivel 1 Devuelve el juego de caracteres predeterminado del sistema. Esto se determina durante el inicio de VM, y no cambiará a partir de entonces. En Android, el juego de caracteres predeterminado es UTF-8. – ewanm89

+1

@ ewanm89: Bueno, la pregunta dice "en Java o Android". Personalmente, sería explícito al respecto de todos modos, solo porque en otras plataformas Java * * no siempre es la predeterminada. Sería demasiado fácil compartir el código con (por ejemplo) un servlet y luego obtener los resultados incorrectos. –

3

Usa [String.getBytes()][1] para convertir a bytes y usa [String(byte[] data)][2] constructor para convertir de nuevo a cadena.

+3

... pero no uses ninguno de estos sin especificar una codificación, de lo contrario estarás usando la codificación predeterminada de la plataforma que puede que ni siquiera sea compatible con todos los caracteres de tu cadena. –

10

Puede hacerlo así.

cadena a matriz de bytes

String stringToConvert = "This String is 76 characters long and will be converted to an array of bytes"; 
byte[] theByteArray = stringToConvert.getBytes(); 

http://www.javadb.com/convert-string-to-byte-array

matriz de bytes en Cadena

byte[] byteArray = new byte[] {87, 79, 87, 46, 46, 46}; 
String value = new String(byteArray); 

http://www.javadb.com/convert-byte-array-to-string

+3

Definitivamente * no usaría * ese código. Supone que la codificación predeterminada de la plataforma es la misma cuando se usa en ambos lugares, y también que la codificación predeterminada de la plataforma maneja todos los caracteres de la cadena. –

+0

El conjunto de caracteres predeterminado de Android es UTF-8, que es el mismo que usted está sugiriendo, por lo que realmente no hay ninguna razón para no hacerlo. Si vas a usar otro tipo de codificación, probablemente deberías usar el código en tu sugerencia y ajustarlo un poco para que se ajuste a cualquier conjunto de caracteres que estés usando. –

+0

Todavía sería explícito al respecto de todos modos. Vea el comentario que acabo de dejar en mi propia respuesta, que también editaré * en * la respuesta. –

0

java.io.FileInputStream importación; import java.io.ByteArrayOutputStream;

FileHashStream public class { // Escribir un nuevo método que proporcionará una nueva matriz de bytes, y cuando esto se lee generalmente a partir de un flujo de entrada

public static byte[] read(InputStream is) throws Exception 
{ 
    String path = /* type in the absolute path for the 'commons-codec-1.10-bin.zip' */; 

    // must need a Byte buffer 

    byte[] buf = new byte[1024 * 16] 

    // we will use 16 kilobytes 

    int len = 0; 

    // we need a new input stream 

    FileInputStream is = new FileInputStream(path); 

    // use the buffer to update our "MessageDigest" instance 

    while(true) 
    { 
     len = is.read(buf); 
     if(len < 0) break; 
     md.update(buf, 0, len); 
    } 

    // close the input stream 

    is.close(); 

    // call the "digest" method for obtaining the final hash-result 

    byte[] ret = md.digest(); 

    System.out.println("Length of Hash: " + ret.length); 

    for(byte b : ret) 
    { 
     System.out.println(b + ", "); 
    } 

    String compare = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"; 

    String verification = Hex.encodeHexString(ret); 

    System.out.println(); 

    System.out.println("===") 

    System.out.println(verification); 

    System.out.println("Equals? " + verification.equals(compare)); 

} 

}

Cuestiones relacionadas