web-dev-qa-db-ja.com

Javaのバイト配列から文字列への配列

Byte []からstring、byte []からbyte []への変換の文字列表現を理解しようとしています...送信する文字列にbyte []を変換しますデータをクライアントに直接エコーバックします。

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]

受信した文字列を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

これらは両方とも私が送信したデータとは異なります。

何か手助け?

171
0909EM

返された文字列を受け取ってそれから文字列を作成することはできません。これは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 array b1の文字列表現を保持し、s2b1に含まれる bytes の文字列表現を保持します。

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

259
Yanick Rochon
String coolString = "cool string";

byte[] byteArray = coolString.getBytes();

String reconstitutedString = new String(byteArray);

System.out.println(reconstitutedString);

それは "クールな文字列"をコンソールに出力します。

とても簡単です。

127
CorayThan

私がしたこと:

クライアントに戻る:

byte[] result = ****encrypted data****;

String str = Base64.encodeBase64String(result);

return str;

クライアントから受け取る:

 byte[] bytes = Base64.decodeBase64(str);

あなたのデータはこのフォーマットで転送されます:

OpfyN9paAouZ2Pw+gDgGsDWzjIphmaZbUyFx5oRIN1kkQ1tDbgoi84dRfklf1OZVdpAV7TonlTDHBOr93EXIEBoY1vuQnKXaG+CJyIfrCWbEENJ0gOVBr9W3OlFcGsZW5Cf9uirSmx/JLLxTrejZzbgq3lpToYc3vkyPy5Y/oFWYljy/3OcC/S458uZFOc/FfDqWGtT9pTUdxLDOwQ6EMe0oJBlMXm8J2tGnRja4F/aVHfQddha2nUMi6zlvAm8i9KnsWmQG//ok25EHDbrFBP2Ia/6Bx/SGS4skk/0couKwcPVXtTq8qpNh/aYK1mclg7TBKHfF+DHppwd30VULpA== 
20
Neeson.Z

Arrays.toString()がすることはあなたのbyteArrayの個々のバイトの文字列表現を作成することです。

APIのドキュメントをチェックしてください Arrays API

応答文字列を元のバイト配列に戻すには、split(",")または何かを使用してそれをコレクションに変換してから、その中の各項目を1つのバイトに変換してバイト配列を再作成する必要があります。

7
Kal

バイト配列を文字列に変換し、文字列をJavaのバイト配列に戻すのは簡単です。正しい方法で「new」を使用するタイミングを知る必要があります。次のようにして行うことができます。

バイト配列から文字列への変換:

byte[] bytes = initializeByteArray();
String str = new String(bytes);

文字列からバイト配列への変換:

String str = "Hello"
byte[] bytes = str.getBytes();

詳細については、見てください: http://evverythingatonce.blogspot.in/2014/01/tech-talkbyte-array-and-string.html

5
user3469161

あなたがあなたのバイト配列([B@405217f8)から見ている種類の出力も長さゼロのバイト配列(すなわちnew byte[0])のための出力です。この文字列は、通常のコレクションのtoString()メソッドから予想されるように、配列の内容の説明ではなく、配列への参照のように見えます。

他の回答者と同様に、バイト配列の内容から文字列を構築するためにbyte[]パラメータを受け取るStringコンストラクタを紹介します。 TCP接続からバイトを取得したい場合は、ソケットのInputStreamから生のバイトを読み取ることができるはずです。

これらのバイトを(Stringを使用して)InputStreamReaderとして既に読んでいる場合は、getBytes()関数を使用して文字列をバイトに変換できます。目的の文字セットを必ずStringコンストラクターとgetBytes()関数の両方に渡してください。これは、バイトデータがInputStreamReaderによって文字に変換できる場合にのみ機能します。

生のバイトを処理したい場合は、このストリームリーダーレイヤを使用しないでください。

3
fuzzyBSc

[JDK8]

import Java.util.Base64;

文字列に:

String str = Base64.getEncoder().encode(new byte[]{ -47, 1, 16, ... });

バイト配列へ

byte[] bytes = Base64.getDecoder().decode("JVBERi0xLjQKMyAwIG9iago8P...");
2

単にバイトとしてバイトを送信したり、各バイトを文字に変換してストリングとして送信したりすることはできませんか。あなたがそうであるようにすることはあなたが送るべき11バイトしか持っていないとき、文字列の中に最低85文字を占めるでしょう。バイトの文字列表現を作成することができるので、それは "[B @ 405217f8"になります。これはPythonでbytesまたはbytearrayオブジェクトに簡単に変換できます。それに失敗すると、22文字を占める一連の16進数( "5b42403430353231376638")としてそれらを表すことができます。これは binascii.unhexlify() を使用してPython側で簡単にデコードできます。

2
JAB

文字列をバイト配列に変換したい場合はString.getBytes()(または同等のPython関数)を使用する必要があります。これにより元のバイト配列を出力することができます。

1
Martin

以下のコードAPIを使用して、バイトコードを文字列としてByte配列に変換します。

 byte[] byteArray = DatatypeConverter.parseBase64Binary("JVBERi0xLjQKMyAwIG9iago8P...");
0
Ajay

[Java 8]

import Java.util.Base64;

String dummy= "dummy string";
byte[] byteArray = dummy.getBytes();

byte[] salt = new byte[]{ -47, 1, 16, ... }
String encoded = Base64.getEncoder().encodeToString(salt);
0
trouble