2011-10-30 16 views
37

È possibile convertire una stringa in serie di byte e quindi riconvertirla nella stringa originale in Java o Android?Converti una stringa in una matrice di byte e quindi torna alla stringa originale

Il mio obiettivo è inviare alcune stringhe a un microcontrollore (Arduino) e archiviarlo in EEPROM (che è solo 1   KB). Ho provato a utilizzare un hash MD5, ma sembra che sia solo una crittografia a senso unico. Cosa posso fare per affrontare questo problema?

+0

Prova utilizzando SHA128 se' inviando la stringa ad un adruino. È reversibile; ma non so se avresti bisogno di quel codice sull'arduino. –

risposta

89

Io suggerirei di usare i membri della stringa, ma con una codifica esplicita:

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

Utilizzando una codifica esplicita (e uno che supporta tutti Unicode) si evitano i problemi di limitarsi a chiamare text.getBytes() ecc:

  • Si sta utilizzando in modo esplicito una codifica specifica, in modo da sapere quale codifica utilizzare in seguito, anziché fare affidamento sull'impostazione predefinita della piattaforma.
  • Sapete che supporterà tutto Unicode (al contrario, per esempio, ISO-Latin-1).

MODIFICA: Anche se UTF-8 è la codifica predefinita su Android, sarei sicuramente esplicito a riguardo. Ad esempio, questa domanda dice solo "in Java o Android" - quindi è del tutto possibile che il codice finirà per essere utilizzato su altre piattaforme.

Sostanzialmente visto che la normale piattaforma Java può avere diverse codifiche predefinite, penso che sia meglio essere assolutamente espliciti. Ho visto troppe persone usare la codifica predefinita e perdere dati per correre questo rischio.

EDIT: Nella fretta ho dimenticato di dire che non c'è bisogno di usare il nome del codifica - è possibile utilizzare un Charset invece. Utilizzando Guava avevo davvero uso:

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

Non è comunque la piattaforma Android UTF-8 predefinita? – ewanm89

+1

set di caratteri statici pubblici defaultCharset() Da: Livello API 1 Restituisce il set di caratteri predefinito del sistema. Questo viene determinato durante l'avvio della VM e non cambierà in seguito. Su Android, il set di caratteri predefinito è UTF-8. – ewanm89

+1

@ ewanm89: Beh, la domanda dice "in Java o Android" - Personalmente sarei personalmente esplicito a riguardo, solo perché su altre piattaforme Java non è * sempre * l'impostazione predefinita. Sarebbe troppo semplice condividere il codice con (diciamo) un servlet e ottenere risultati errati. –

3

Utilizzare [String.getBytes()][1] per convertire in byte e utilizzare il costruttore [String(byte[] data)][2] per riconvertire in stringa.

+3

... ma non usare nessuno di questi senza specificare una codifica, altrimenti si sta utilizzando la codifica predefinita della piattaforma che potrebbe non supportare nemmeno tutti i caratteri della stringa. –

10

Puoi farlo in questo modo.

stringa di byte

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

matrice Byte String

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

Io sicuramente * non userei * quel codice. Si presuppone che la codifica predefinita della piattaforma sia la stessa quando viene utilizzata in entrambe le posizioni e che la codifica predefinita della piattaforma gestisca tutti i caratteri nella stringa. –

+0

Il set di caratteri predefinito di Android è UTF-8, che è lo stesso di quello che stai suggerendo, quindi non c'è davvero alcun motivo per non farlo. Se hai intenzione di utilizzare un altro tipo di codifica, dovresti probabilmente usare il codice nel tuo suggerimento e regolarlo un po 'per adattarlo a qualsiasi charset tu stia utilizzando. –

+0

Sarei comunque esplicito a riguardo. Vedi il commento che ho appena lasciato sulla mia risposta, che modificherò * nella * risposta. –

0

import java.io.FileInputStream; importazione java.io.ByteArrayOutputStream;

public class FileHashStream {// scrivere un nuovo metodo che fornirà un nuovo array di byte, e dove questo genere legge da un flusso di input

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)); 

} 

}

Problemi correlati