1

Java で Android 2.3.3 アプリケーションを開発しています。

このアプリは、署名されていないデータ型を Java に移植した iOS コードです。

iOS では、 と で動作しUInt16ますUInt8。あるケースでは、代わりbyte[]に I'm using を使用してchar[]います。

しかし、 DatagramPacketchar[]byte[]使用してそれを送信する必要があることを知っています。

char[] の 1 つの要素が 128 の場合、byte[] に挿入するにはどうすればよいですか。レシーバーは 128 を取得します。これを行うとどうなるかわかりません。

char c = (char)128;
byte b = (byte)c;

どれがb値になりますか?
128 = 10000000。b = -1 または b = 127?

ビットを失うことなく変換char[]するにはどうすればよいですか?byte[]

4

2 に答える 2

8

Java ではchar、符号なしの 16 ビット量です。したがって、他に何もせずuint16に直接変換できます。char

符号なし 8 ビット数量の場合、次の 2 つのオプションがあります。

  1. を使用しbyteます。また、8 ビットを保持します。署名されているからといって、ビットを失うことはありません。ただし、算術演算を行う場合、Java はbyte自動的に にスケールアップしint、符号拡張することを覚えておく必要があります。これを防ぐには、常に次のようにマスクします。

    バイト b; int foo = 5 * (b & 0xFF);

  2. を使用しcharます。これは符号なしで 16 ビットを保持できるため、8 ビットがうまく収まります。byteaを aに入れるには、次のcharようにします。

    バイト b; char c = (char)(b & 0xFF); // 下位 8 ビットをマスクします

chara をbytejust doに入れるには:

char c;
byte b = (byte)c; // Truncates to 8 bits

byteJava では符号付きであるため、算術演算を行うときは常に下位 8 ビットのみをマスクする必要があることに注意してください(符号拡張を防ぐため)。このような:

byte b;
int foo = (b & 0xFF);

マスクすることなく、バイトで必要なすべての通常のビット単位の操作を実行できます。

byte b;
if (b & 0x80) ... // Test a flag
b |= 0x40; // Set a flag
b ^= 0x20; // Flip a flag from 0 to 1 or 1 to 0
b ^= ~0x10; // Clear a flag
byte x = b << 3; // Shift left 3 bits and assign
byte x = b >>> 4; // Shift right 4 bits and assign (WITHOUT sign extension)
于 2012-07-17T17:22:14.500 に答える
2

char[]に変換する必要がないように、アプローチを再考する必要があると思いますbyte[]

new String(char[])データが実際に文字である場合は、 を使用して文字列を作成し、 を使用getBytes(Charset)して特定のエンコードされたバイトを取得するなど、さまざまなシリアライゼーション手法を検討する必要がありますCharset(もちろん、同じ文字が異なるバイトになるためです。 ASCII または UTF-8 または UTF-16 などでエンコードされます)。

しかし、あなたの質問から、実際には文字を使用していないように聞こえますchar.16ビット型として使用しているだけです. もしそうなら、変換を行うことは難しくありません。次の行に沿ったものです:

byte[] toBytes(char[] chars) {
    byte[] bytes = new byte[chars.length * 2];
    int ci, bi;
    char ch;

    bi = 0;
    for (ci = 0; ci < chars.length; ++ci) {
        ch = chars[ci];
        bytes[bi++] = (byte)((ch & 0xFF00) >> 8);
        bytes[bi++] = (byte)(ch & 0x00FF);
    }

    return bytes;
}

結果をスモール エンディアンにしたい場合は、マスクを逆にします。

しかし、繰り返しますが、私はあなたの全体的なアプローチを見て、これを避けようとします.

于 2012-07-17T14:56:02.327 に答える