将String转换为字节数组,然后再转换回原始String

时间:2011-10-30 21:15:31

标签: java android byte hash arduino

是否可以将字符串转换为字节数组,然后将其转换回Java或Android中的原始字符串?

我的目标是将一些字符串发送到微控制器(Arduino)并将其存储到EEPROM(仅1 KB)中。我试图使用MD5哈希,但似乎它只是单向加密。我该怎么做才能解决这个问题?

5 个答案:

答案 0 :(得分:108)

我建议使用string的成员,但使用明确的编码

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代替。使用Guava真的使用:

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

答案 1 :(得分:11)

你可以这样做。

字符串到字节数组

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

答案 2 :(得分:3)

使用[String.getBytes()][1]转换为字节并使用[String(byte[] data)][2]构造函数转换回字符串。

答案 3 :(得分:2)

看看这个,你可以使用Base85: Base85 aka ASCII85 java projects

有同样的问题。

答案 4 :(得分:0)

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

public class FileHashStream {     //编写一个新方法,它将提供一个新的Byte数组,并且通常从输入流中读取

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

}

}