1. ホーム
  2. java

[解決済み] Java バイト配列→文字列→バイト配列

2022-05-01 17:29:56

質問

byte[]から文字列、byte[]からbyte[]への変換の文字列表現を理解しようとしているのですが・・・。私はbyte[]を文字列に変換して送信し、私はWebサービス(pythonで書かれている)がクライアントにデータを直接エコーバックすることを期待します。

Javaアプリケーションからデータを送信すると...。

Arrays.toString(data.toByteArray())

送信するバイト数.

[B@405217f8

送信 (これは Arrays.toString() の結果で、私のバイトデータを文字列で表現したものです。このデータはワイヤーを介して送信されます)

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

Python側では、Pythonサーバーが呼び出し側に文字列を返します(これは、私がサーバーに送った文字列と同じであることがわかります)。

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

サーバーはこのデータをクライアントに返し、そこで検証できるようにする必要があります。

私のクライアントが受け取るレスポンスは(文字列として)次のようになります。

[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]

受信した文字列をどうやったら byte[]

何をやっても以下のようなバイト配列になってしまうようです...。

[91, 45, 52, 55, 44, 32, 49, 44, 32, 49, 54, 44, 32, 56, 52, 44, 32, 50, 44, 32, 49, 48, 49, 44, 32, 49, 49, 48, 44, 32, 56, 51, 44, 32, 49, 49, 49, 44, 32, 49, 48, 57, 44, 32, 49, 48, 49, 44, 32, 51, 50, 44, 32, 55, 56, 44, 32, 55, 48, 44, 32, 54, 55, 44, 32, 51, 50, 44, 32, 54, 56, 44, 32, 57, 55, 44, 32, 49, 49, 54, 44, 32, 57, 55, 93]

または、次のようなバイト表現が得られます。

B@2a80d889

どちらも私の送信データとは異なりますが...。何か本当に単純なことを見逃しているのでしょうか...。

何かお手伝いできることはありますか?

解決方法は?

返された文字列を取り出し、そこから文字列を構成することはできません...これは byte[] データ型はもう文字列なので、パースする必要があります。例えば.

String response = "[-47, 1, 16, 84, 2, 101, 110, 83, 111, 109, 101, 32, 78, 70, 67, 32, 68, 97, 116, 97]";      // response from the Python script

String[] byteValues = response.substring(1, response.length() - 1).split(",");
byte[] bytes = new byte[byteValues.length];

for (int i=0, len=bytes.length; i<len; i++) {
   bytes[i] = Byte.parseByte(byteValues[i].trim());     
}

String str = new String(bytes);

** EDIT **

ご質問の中で、" と書かれているところに問題のヒントがありますね。 Whatever I seem to try I end up getting a byte array which looks as follows... [91, 45, ... というのは 91 のバイト値です。 [ というように [91, 45, ... は、文字列 " のバイト配列です。 [-45, 1, 16, ... という文字列があります。

メソッド Arrays.toString() を返します。 String つまり、返される値はもう配列ではありません。たとえば、以下のようになります。

byte[] b1 = new byte[] {97, 98, 99};

String s1 = Arrays.toString(b1);
String s2 = new String(b1);

System.out.println(s1);        // -> "[97, 98, 99]"
System.out.println(s2);        // -> "abc";

ご覧の通りです。 s1 の文字列表現を保持します。 配列 b1 , 一方 s2 の文字列表現を保持します。 バイト に含まれる b1 .

さて、あなたの問題では、サーバーは次のような文字列を返します。 s1 したがって、配列表現を返すには、逆のコンストラクタ・メソッドが必要です。もし s2.getBytes() の反対は new String(b1) の反対を探さなければならない。 Arrays.toString(b1) そのため、この回答の最初のスニペットに貼り付けたコードになります。