web-dev-qa-db-ja.com

Javaで終端文字がnullのバイト配列を文字列に変換するにはどうすればよいですか?

バイト配列からStringオブジェクトを作成するにはどうすればよいですか

byte arr[MAX_SIZE];  // Java

配列要素の1つがC null終了バイトですか?呼び出すのと同じくらい簡単ですか

String str = new String( arr );

Stringコンストラクターは、null終了文字で自動的に停止することを知っていますか? nullバイトの後のバイトは、(おそらく)文字列に含めたくない文字です。 不明な長さのフィールドを含むバイト配列の解析 の最後の応答は、配列をループして手動でnull終了文字を見つけることを提案していますが、文字列コンストラクターがこれを自動的に実行するかどうか疑問に思っていました。また、システムのデフォルトの文字セットがすべての端で使用されると想定しています。

25
Phillip
byte arr[] = ...
Charset charset = ...
int i;
for (i = 0; i < arr.length && arr[i] != 0; i++) { }
String str = new String(arr, 0, i, charSet);

ノート:

  • 一般に、アプリケーションがプラットフォームのデフォルトの文字セット/エンコーディングに依存しないように、明示的なCharSetパラメータを使用することをお勧めします。

  • これは一部の文字セットでは機能しません。たとえば、UTF-16でエンコードされた文字列は、多くのコード単位にゼロバイトが含まれているため、ゼロで終了するバイトシーケンスとして安全に表すことができません。 (一方、文字列にコードポイント0のインスタンスが含まれていない場合、UTF-8は問題ありません。「 TF-8にゼロバイトを含めることはできますか? 」を参照)

...しかし、Stringコンストラクタがこれを自動的に実行するかどうか疑問に思っていました。

いいえ/彼らはしません。 (「不思議」にしないでください... javadocを読んでください:-))

また、システムのデフォルトの文字セットがすべての端で使用されると想定しています。

文字セットを指定しない場合、Javaプラットフォームのデフォルトが使用されます。これはシステムである可能性がありますデフォルトですが、これは保証されていません。

21
Stephen C

これはどう:

String str = new String(arr).split("\0")[0];
11
davogotland

これを試してください:String s = new String(arr).trim()

10
Eric

ヌルターミネーターで魔法のように停止することはありません。 null文字はJavaの文字列を終了しません。最初のヌル文字のインデックスを見つけてそこで停止する必要があります。その後、String(byte[] arr, int offset, length)コンストラクタを使用します。

4
sjr