Преобразовать строку в байтовый массив, а затем обратно в исходную строку - PullRequest
49 голосов
/ 31 октября 2011

Можно ли преобразовать строку в байтовый массив, а затем преобразовать ее обратно в исходную строку в Java или Android?

Моя цель - отправить несколько строк в микроконтроллер (Arduino) и сохранить их в EEPROM (который составляет всего 1 КБ). Я пытался использовать хеш MD5 , но, похоже, это только одностороннее шифрование. Что я могу сделать, чтобы решить эту проблему?

Ответы [ 5 ]

109 голосов
/ 31 октября 2011

Я бы предложил использовать члены строки, но с явной кодировкой :

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

Используя явную кодировку (и ту, которая поддерживает все Unicode), вы избегаетепроблемы простого вызова text.getBytes() и т. д .:

  • Вы явно используете конкретную кодировку, поэтому вы знаете, какую кодировку использовать позже, а не полагаться на платформу по умолчанию.
  • Вы знаете, что он будет поддерживать весь Unicode (в отличие, скажем, от ISO-Latin-1).

РЕДАКТИРОВАТЬ: Даже если UTF-8 является кодировкой по умолчанию на Android, я определенно будупрямо об этом.Например, этот вопрос говорит только «в Java или Android» - поэтому вполне возможно, что код в конечном итоге будет использоваться на других платформах.

В основном, учитывая, что обычная платформа Java может имеют разные кодировки по умолчанию, я думаю, что лучше быть абсолютно явным.Я видел слишком много людей, использующих кодировку по умолчанию и теряющих данные, чтобы пойти на этот риск.

РЕДАКТИРОВАТЬ: В спешке я забыл упомянуть, что вам не нужно использовать имя кодировки - вместо этого вы можете использовать Charset.Использование Гуава Я бы действительно Использование:

byte[] bytes = text.getBytes(Charsets.UTF_8);
String text = new String(bytes, Charsets.UTF_8);
11 голосов
/ 31 октября 2011

Вы можете сделать это следующим образом.

строка в байтовый массив

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

байтовый массив дляСтрока

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 голосов
/ 31 октября 2011

Используйте [String.getBytes()][1] для преобразования в байты и используйте конструктор [String(byte[] data)][2] для преобразования обратно в строку.

2 голосов
/ 31 октября 2011

Проверьте это, вы можете использовать Base85: Base85 aka ASCII85 java projects

Имел тот же вопрос.

0 голосов
/ 27 декабря 2016

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

открытый класс FileHashStream { // написать новый метод, который предоставит новый байтовый массив и где он обычно читает из входного потока

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

}

}

...