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