9

バイトの読み取りと文字列の作成が必要な作業を開始しようとしています。読み取られるバイトは UTF-16 文字列を表します。そこで、テストするために、UTF-16 エンコーディングの単純なバイト配列を文字列に変換したいと考えました。配列の最初の 2 バイトはエンディアンを表す必要があるため、0xff 0xfe または 0xfe 0xff のいずれかでなければなりません。そこで、次のようにバイト配列を作成してみました。

byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};

しかし、0xFF と 0xFE が大きすぎて 1 バイトに収まらないため (バイトは Java で署名されているため)、エラーが発生しました。より正確には、エラーは int をバイトに変換できなかったことです。キャストを使用して int から byte に明示的に変換し、目的の結果を得ることができることはわかっていますが、それは私の質問ではありません。

何かを試すために、String を作成して getBytes("UTF-16") を呼び出し、配列内の各バイトを出力しました。最初の 2 バイトが 0xFFFFFFFE 0xFFFFFFFF であり、その後に 0x00 0x52 0x00 0x6F が続くため、出力は少し混乱しました。(明らかに、ここでのエンディアンは、上で作成しようとしていたものとは異なりますが、それは重要ではありません)。

この出力を使用して、同じ方法でバイト配列を作成してみることにしました。

byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};

そして奇妙なことに、それはうまくいきました。だから私の質問は、Java が明示的なキャストなしで 0xFFFFFF80 以上の整数値を自動的にバイトに変換できるのはなぜですか?

4

5 に答える 5

2

ヒントなしで数値を使用すると (たとえば、long の場合は 1234L)、コンパイラは整数を想定します。値は、警告なしでキャストできる0xffffffff値を持つ整数です。-1byte

于 2009-12-20T12:33:11.353 に答える
0

0xffffffff は数値 -1 であるため、-1 はバイトとして解釈できます。

于 2009-12-20T12:33:28.483 に答える
0

0xff0x000000ffではなく、書くことと同じ0xffffffffです。それがあなたの問題です。整数は正の数 (255) ですが、バイト (ビットごとに変換された場合) は負の数 (-1) になります。しかし、 として0xffffffffも としても -1です。intbyte

于 2009-12-20T12:34:22.380 に答える
0

int は符号付きで、0xffffffff は -1 を表し、0xff は値 255 の整数を表すため、バイトの -128 (0x80) +127 (0x7f) の範囲にはありません。

于 2009-12-20T12:36:00.677 に答える