web-dev-qa-db-fra.com

Convertir une chaîne en un tableau d'octets, puis revenir à la chaîne d'origine

Est-il possible de convertir une chaîne en tableau d'octets, puis de la reconvertir en chaîne d'origine Java ou Android?)?

Mon objectif est d’envoyer des chaînes de caractères à un microcontrôleur (Arduino) et de les stocker dans une mémoire EEPROM (d’une capacité de 1 Ko seulement). J'ai essayé d'utiliser un hash MD5 , mais il semble que ce soit un cryptage à sens unique. Que puis-je faire pour régler ce problème?

49
Eng.Fouad

Je suggère d'utiliser les membres de chaîne, mais avec un codage explicite :

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

En utilisant un codage explicite (et un qui supporte tout le Unicode), vous évitez les problèmes d'appeler simplement text.getBytes() etc:

  • Vous utilisez explicitement un encodage spécifique, vous savez donc quel encodage utiliser ultérieurement, plutôt que de vous fier à la plate-forme par défaut.
  • Vous savez qu'il supportera tout le Unicode (par opposition à, disons, ISO-Latin-1).

EDIT: Même si UTF-8 est le codage par défaut sur Android, je serais certainement explicite à ce sujet. Par exemple, cette question ne dit que "dans Java ou Android") - il est donc tout à fait possible que le code finisse par être utilisé sur d'autres plates-formes.

Fondamentalement, étant donné que la plate-forme normale Java peut avoir différents encodages par défaut, je pense qu'il est préférable d'être absolument explicite. I J'ai vu trop de gens utiliser l'encodage par défaut et perdre des données pour prendre ce risque.

EDIT: Dans ma hâte, j'ai oublié de mentionner que vous n'avez pas à utiliser le nom de l'encodage - vous pouvez utiliser un Charset à la place. . En utilisant Guava Je voudrais vraiment utiliser:

byte[] bytes = text.getBytes(Charsets.UTF_8);
String text = new String(bytes, Charsets.UTF_8);
109
Jon Skeet

Vous pouvez le faire comme ça.

Chaîne en tableau d'octets

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

Tableau d'octets en chaîne

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

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

11
Michell Bak

Utilisez [String.getBytes()][1] pour convertir en octets et utilisez le constructeur [String(byte[] data)][2] pour reconvertir en chaîne.

3
Szere Dyeri

Découvrez ceci, vous pouvez utiliser Base85: Base85 aussi nommé ASCII85 Java projets

Avait la même question.

2
Mat B.

importer Java.io.FileInputStream; importer Java.io.ByteArrayOutputStream;

classe publique FileHashStream {// écrire une nouvelle méthode qui fournira un nouveau tableau d'octets, et où il lit généralement à partir d'un flux d'entrée

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

}

}

0
user6798393