【问题标题】:Convert a String to a byte array and then back to the original String将字符串转换为字节数组,然后再转换回原始字符串
【发布时间】:2011-12-18 08:55:50
【问题描述】:

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

我的目标是将一些字符串发送到微控制器 (Arduino) 并将其存储到 EEPROM(只有 1 KB)中。我尝试使用MD5 哈希,但它似乎只是单向加密。我该如何处理这个问题?

【问题讨论】:

  • 如果您要将字符串发送到 adruino,请尝试使用 SHA128。它是可逆的;但我不知道你是否需要 arduino 上的代码。

标签: java android byte hash arduino


【解决方案1】:

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

【讨论】:

  • ... 但不要在没有指定编码的情况下使用其中任何一个,否则您使用的是平台默认编码,它甚至可能不支持字符串中的所有字符。
【解决方案2】:

你可以这样做。

字符串到字节数组

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

【讨论】:

  • 我绝对不会使用该代码。它假设在两个地方使用时平台默认编码是相同的,并且平台默认编码处理字符串中的所有字符。
  • Android 的默认字符集是 UTF-8,这和你建议的一样,所以真的没有理由不这样做。如果您打算使用另一种编码,您可能应该使用建议中的代码并对其进行一些调整以适合您使用的任何字符集。
  • 无论如何我仍然会明确表示。请参阅我刚刚在自己的答案中留下的评论,我还将将其编辑答案中。
  • 我总体上同意您对 Java 的评论,但它在 Android 中没有任何意义。为什么在默认情况下已经设置了一些明确的写?没有任何意义。
  • 因为它是 only Android 中的默认设置,而且很容易将代码复制到 servlet 中而不知道它引入了错误。你看不到这种情况吗?我至少会写一条评论,说明这保证在 Android 上使用 UTF-8,而在其他平台上则不保证。该注释将比明确指定编码要长得多...
【解决方案3】:

我建议使用字符串的成员,但使用显式编码

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平台可以有不同的默认编码,我认为最好是绝对明确的。我见过太多人使用默认编码并丢失数据来承担这种风险。

编辑:我匆忙中忘了提到您不必使用编码的 name - 您可以使用 Charset 代替。使用Guava 我会真的使用:

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

【讨论】:

  • 不是 UTF-8 android 平台默认的吗?
  • public static Charset defaultCharset () 自:API 级别 1 返回系统的默认字符集。这是在 VM 启动期间确定的,此后不会更改。在 Android 上,默认字符集是 UTF-8。
  • @ewanm89:嗯,问题是“在 Java 或 Android 中”——我个人还是会明确说明这一点,因为在其他 Java 平台上它总是默认的.与(例如)servlet 共享代码然后得到错误的结果太容易了。
  • 如果您使用的是 Android,您可以使用 StandardCharsets.UTF_8
  • @JonSkeet:同意。只是想分享如果有人觉得它有用。如果可能,请使用此更新您的帖子。
【解决方案4】:

导入 java.io.FileInputStream; 导入 java.io.ByteArrayOutputStream;

公共类 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));

}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 2017-04-14
    • 2019-10-16
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    相关资源
    最近更新 更多