Java Stringをbyte []に​​変換する方法は?


539

Java Stringbyte[](ボックス化されていないByte[])に変換する方法はありますか?

これを試すことで:

System.out.println(response.split("\r\n\r\n")[1]);
System.out.println("******");
System.out.println(response.split("\r\n\r\n")[1].getBytes().toString());

そして、私は別々の出力を得ています。これはgzip文字列であるため、最初の出力を表示できません。

<A Gzip String>
******
[B@38ee9f13

2番目はアドレスです。私が間違っていることはありますか?byte[]次のように、gzipデコンプレッサにフィードするための結果が必要です。

String decompressGZIP(byte[] gzip) throws IOException {
    java.util.zip.Inflater inf = new java.util.zip.Inflater();
    java.io.ByteArrayInputStream bytein = new java.io.ByteArrayInputStream(gzip);
    java.util.zip.GZIPInputStream gzin = new java.util.zip.GZIPInputStream(bytein);
    java.io.ByteArrayOutputStream byteout = new java.io.ByteArrayOutputStream();
    int res = 0;
    byte buf[] = new byte[1024];
    while (res >= 0) {
        res = gzin.read(buf, 0, buf.length);
        if (res > 0) {
            byteout.write(buf, 0, res);
        }
    }
    byte uncompressed[] = byteout.toByteArray();
    return (uncompressed.toString());
}


申し訳ありませんが、文字列をバイト配列に変換したり、元に戻したりして、間違った結果を取得しようとしています。しばらくしてから編集して戻ってきます。
Mkl Rjv 2013

9
あなたの問題はString.getBytes()実際にtoString()バイト配列を返すことですが、バイト配列のが有用な結果を返すというあなたの信念は正しくありません。
Louis Wasserman 2013

回答:


950

メソッドにdecompressGZIP()必要なオブジェクトはbyte[]です。

したがって、あなたが尋ねた質問に対する基本的で技術的な答えは次のとおりです。

byte[] b = string.getBytes();
byte[] b = string.getBytes(Charset.forName("UTF-8"));
byte[] b = string.getBytes(StandardCharsets.UTF_8); // Java 7+ only

しかし、あなたが取り組んでいるように見える問題は、これがあまりうまく表示されないことです。呼び出しは、クラス名+メモリアドレスでtoString()あるデフォルトObject.toString()を与えるだけです。あなたの結果[B@38ee9f13では、[B手段byte[]38ee9f13は、で区切られたメモリアドレス@です。

表示目的には、次のものを使用できます。

Arrays.toString(bytes);

ただし、これは、コンマ区切りの整数のシーケンスとして表示されるだけで、必要な場合とそうでない場合があります。

Stringから読み取り可能な状態に戻すには、次byte[]を使用します。

String string = new String(byte[] bytes, Charset charset);

このCharsetバージョンが好まれる理由はString、JavaのすべてのオブジェクトがUTF-16として内部的に格納されるためです。に変換すると、選択された文字セットに応じて、指定されたbyte[]そのグリフのバイトの異なる内訳が表示されますString


26
string.getBytes( "UTF-8")はUnsupportedEncodingExceptionを処理する必要がありますが、string.getBytes(Charset.forName( "UTF-8"))は処理しません。どの方法が「より良い」かについての議論は、読者のための練習問題として残しておきます。
マイケルワーナー

20
string.getBytes(StandardCharsets.UTF_8)また、使用することができ、それは同じであるstring.getBytes(Charset.forName("UTF-8"))
Bahadırイェーガン

3
私は信じていStandardCharsetsたJava 7で新しく追加されました
スチュワート

2
この回答がなぜ多くの賛成票を獲得したのか理解できません。それは正しいかもしれませんが、あまり役に立ちません...コードの数行だけです。そのほとんどはOPに既にあり、違いCharset.forName("UTF-8")がもたらすものやそれがなぜ重要なのかを説明していません。
LarsH 2015年

3
@LarsHあなたは良い点を作ります。正直なところ、この回答がそれほど人気になるとは思いませんでした。私は今、賛成投票に「値する」ために答えを拡大しました。うまくいけば、それは改善です。
Stewart


14

String.getBytes()を使用してみてください。文字列データを表すbyte []を返します。例:

String data = "sample data";
byte[] byteData = data.getBytes();

14

単に:

String abc="abcdefghight";

byte[] b = abc.getBytes();

abcUS-ASCII以外の文字、"greater than 2³² − 1"たとえばバイナリデータ(「 A b2」など)のみが含まれている場合はどうなりますか?
U. Windl

これは、この文字列が5文字しかないような文字には機能しません。しかし、私が使用するとき、 getBytes()7文字を得ました。
Teocci


7

あなたは試してみたいかもしれません return new String(byteout.toByteArray(Charset.forName("UTF-8")))


1
バイトから文字列への別の方法を示してくれてありがとう。
Trismegistos

1

Stringパラメータとしてjavaを変更する必要はありません。ポインタとそのコードなしで文字列を受け取るには、cコードを変更する必要があります。

Bool DmgrGetVersion (String szVersion);

Char NewszVersion [200];
Strcpy (NewszVersion, szVersion.t_str ());
.t_str () applies to builder c ++ 2010

1

私はパーティーに少し遅れていることを知っていますが、これはかなりきちんと機能します(私たちの教授が私たちにそれを与えました)

public static byte[] asBytes (String s) {                   
           String tmp;
           byte[] b = new byte[s.length() / 2];
           int i;
           for (i = 0; i < s.length() / 2; i++) {
             tmp = s.substring(i * 2, i * 2 + 2);
             b[i] = (byte)(Integer.parseInt(tmp, 16) & 0xff);
           }
           return b;                                            //return bytes
    }

1
これは、16進エンコードされたバイト配列をデコードします。この質問の内容とは非常に異なる何か。
Palec、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.