[解決済み] 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]
受信した文字列をどうやったら 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)
そのため、この回答の最初のスニペットに貼り付けたコードになります。
関連
-
Spring Boot による HTTPS アクセスの設定
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
jd-gui Java Exceptionが発生しました。
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした
-
[解決済み】バイト配列を文字列に変換する方法と、逆に文字列を文字列に変換する方法は?