私は、byte[]から文字列、byte[]からbyte[]への変換の文字列表現を理解しようとしています...。私はbyte[]を文字列に変換して送信し、(pythonで書かれた)私のウェブサービスがデータをそのままクライアントにエコーバックすることを期待しています。
私のJavaアプリケーションからデータを送信すると...
Arrays.toString(data.toByteArray())
送信するバイト数...
[B@405217f8
Send (これは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
どちらも私の送信したデータとは異なります...。私は何か本当に簡単なことを見逃しているのかもしれません。....
何かいい方法はないでしょうか?
これはもう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
あなたの質問には、問題のヒントがあります。[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)
の反対を見つける必要があり、この回答の最初のスニペットに貼り付けたコードがそれにあたります。
バイトをバイトとして送るか、各バイトを文字に変換して文字列として送ることはできないのでしょうか?あなたのようなやり方では、11バイトしか送れないのに、文字列の中で最低85文字を消費してしまいます。バイトの文字列表現を作れば、 "[B@405217f8" となり、Pythonのbytes
またはbytearray
オブジェクトに簡単に変換できます。それができなければ、22文字からなる一連の16進数("5b42403430353231376638")として表現することができ、Python側ではbinascii.unhexlify()
を使って簡単にデコードすることができます。