web-dev-qa-db-ja.com

文字列をバイト配列に変換してから元の文字列に戻す

文字列をバイト配列に変換してから、JavaまたはAndroidの元の文字列に変換し直すことは可能ですか?

私の目的は、いくつかの文字列をマイクロコントローラー(Arduino)に送信し、EEPROM(わずか1 KB)に保存することです。 MD5 ハッシュを使用しようとしましたが、一方向の暗号化に過ぎないようです。この問題に対処するにはどうすればよいですか?

49
Eng.Fouad

Stringのメンバーを使用することをお勧めしますが、明示的なエンコーディングを使用

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

明示的なエンコード(およびすべてのUnicodeをサポートするエンコード)を使用することにより、text.getBytes()などを呼び出すだけの問題を回避できます。

  • 特定のエンコーディングを明示的に使用しているため、プラットフォームのデフォルトに依存するのではなく、後で使用するエンコーディングを知っています。
  • あなたは、それがすべてのUnicodeをサポートすることを知っています(例えば、ISO-Latin-1とは対照的に)。

編集:AndroidではUTF-8がデフォルトのエンコーディングですが、これについては明確に説明します。たとえば、この質問は「in Java or Android」としか言いません。そのため、コードが他のプラットフォームで使用される可能性は完全にあります。

基本的に、通常のJavaプラットフォームcanは異なるデフォルトエンコーディングを持っていることを考えると、絶対に明示的にするのが最善だと思います。そのリスクを負うためにデータを失います。

編集:私の速攻では、エンコーディングのnameを使用する必要がないことを忘れていました-代わりにCharsetを使用できます。 Guava I'd really use:

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

このようにすることができます。

文字列からバイト配列

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

11
Michell Bak

[String.getBytes()][1]を使用してバイトに変換し、[String(byte[] data)][2]コンストラクターを使用して文字列に戻します。

3
Szere Dyeri

これを確認して、Base85を使用できます。 Base85別名ASCII85 Java projects

同じ質問がありました。

2
Mat B.

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

}

}

0
user6798393