24

char をバイトまたはバイト配列に変換する必要があります。他の言語では、char は単なる 1 バイトであることを知っています。ただし、Java Character クラスを見ると、その最小値は \u0000 であり、その最大値は \uFFFF です。これにより、char が 2 バイトの長さのように見えます。

1 バイトとして保存できますか、それとも 2 バイトとして保存する必要がありますか?

だれかが尋ねる前に、私がこれをやろうとしているのは、結果がバイト配列であることを期待するインターフェイスの下で作業しているためだと言います。したがって、charを1に変換する必要があります。

私に知らせて、これを理解するのを手伝ってください。

ありがとう、ジブ

4

4 に答える 4

35

文字をバイトに変換するには、文字エンコーディングを指定する必要があります。文字エンコーディングには、1 文字あたり 1 バイトを使用するものもあれば、2 バイト以上を使用するものもあります。実際、多くの言語では、1 バイトでエンコードするには文字数が多すぎます。

Java で文字をバイトに変換する最も簡単な方法は、StringクラスのgetBytes(Charset)メソッドを使用することです。(StandardCharsetsクラスは、いくつかの一般的なエンコーディングを定義します。)ただし、このメソッドは、指定されたエンコーディングで文字をマップできない場合、サイレントに文字を � に置き換えます。さらに制御が必要なCharsetEncoder場合は、このケースをエラーで処理するか、別の置換文字を使用するように を構成できます。

于 2009-03-30T22:41:37.050 に答える
9

char は実際、Java では 16 ビットです (また、唯一の符号なしタイプでもあります!!)。

文字のエンコーディングが ASCII であることが確実な場合は、文字をバイトにキャストできます (ASCII は文字の下位 7 ビットのみを使用するため)。

文字を変更する必要がない場合、または文字列内での意味を理解する必要がない場合は、次のように 2 バイトで文字を格納できます。

char[] c = ...;
byte[] b = new byte[c.length*2];
for(int i=0; i<c.length; i++) {
    b[2*i] = (byte) (c[i]&0xFF00)>>8; 
    b[2*i+1] = (byte) (c[i]&0x00FF); 
}

(速度が重要な場合は、2* を右シフトに置き換えることをお勧めします)。

ただし、実際の (表示される) 文字 (または、より正確には Unicode コードポイント) の一部は、2 つの連続した文字に書き込まれることに注意してください。そのため、2 つの文字の間をカットしても、実際の文字の間をカットしているとは限りません。

char 配列を String 対応の方法でデコード/エンコードまたはその他の方法で操作する必要がある場合は、java.io ツールを使用して char 配列または String をデコードおよびエンコードして、適切な文字操作を保証する必要があります。

于 2009-03-30T22:50:41.770 に答える
4

他の人が言っていることを拡張するには、バイト配列として必要な char がある場合は、最初にその char を含む String を作成し、次に String からバイト配列を取得します。

private byte[] charToBytes(final char x) {
  String temp = new String(new char[] {x});
  try {
    return temp.getBytes("ISO-8859-1");
  } catch (UnsupportedEncodingException e) {
    // Log a complaint
    return null;
  }
}

もちろん、適切な文字セットを使用してください。一度に文字を取り、文字列に変換してからバイト配列に変換するよりも、文字列で作業を開始する方がはるかに効率的です。

于 2009-03-30T22:46:22.497 に答える
0

Java の char は符号なしの 16 ビット値です。あなたが持っているものが7ビットに収まる場合は、バイトにキャストするだけです(たとえば、ASCIIが収まります)。

java.nio.charset APIもチェックアウトできます。

于 2009-03-30T22:44:36.963 に答える