Java バイト配列から文字列、そしてバイト配列へ 質問する

Java バイト配列から文字列、そしてバイト配列へ 質問する

私は、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]

受信した文字列をバイト[]に戻す方法がわかりません

何を試しても、最終的には次のようなバイト配列が取得されます...

[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

これらは両方とも私が送信したデータとは異なります...本当に単純な何かを見逃しているに違いありません...

何か助けて?

ベストアンサー1

返された文字列を取得して、そこから文字列を構築することはできません。これは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);

**編集**

質問の中に「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文字列表現を保持しています。配列 b1s2文字列表現を保持しますバイトに含まれたb1

さて、あなたの問題では、サーバーは に似た文字列を返すのでs1、配列表現を取得するには、反対のコンストラクタ メソッドが必要です。s2.getBytes()が の反対である場合new String(b1)、 の反対を見つける必要がありますArrays.toString(b1)。そのため、この回答の最初のスニペットに貼り付けたコードがあります。

おすすめ記事