- - PR -
バイナリファイルのbyte→int変換
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-10-13 19:27
お世話になります。
バイナリファイルの1バイト目を読み込み int型に変換する処理を作成しています。 --- test.binary --- 0xC7 --- ソース ---- byte buff[] = new byte[1]; String file = "c:/test.binary"; BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); bis.read(buff, 0, buff.length); bis.close(); System.out.println((int)buff[0]); --- 実行結果 --- -57 期待している実行結果は199(0xC7)ですが、-57と表示されてしまいます。 Javaのbyte型は-128 〜 127までしか表現できないからだと思いますが 期待している実行結果を得るためにはどのように処理すればよろしいでしょうか? ご教授お願いできれば幸いです。 よろしくお願い致します。 以上 [ メッセージ編集済み 編集者: hoho 編集日時 2005-10-13 19:28 ] [ メッセージ編集済み 編集者: hoho 編集日時 2005-10-13 19:29 ] [ メッセージ編集済み 編集者: hoho 編集日時 2005-10-13 19:30 ] | ||||||||
|
投稿日時: 2005-10-13 19:43
こんなんでどうでしょう。 | ||||||||
|
投稿日時: 2005-10-13 21:44
ご返信ありがとうございます。
なるほど、b & 0xff とすればいいのですね。 でも、& 0xffするのはどういう理由からでしょうか? よろしくお願い致します。 | ||||||||
|
投稿日時: 2005-10-13 21:47
Java でも unsigned 付けられるようにすべきでしょう。。。
Sun Microsystems は (プ | ||||||||
|
投稿日時: 2005-10-14 02:02
これを説明するのは結構ムズカシイかもしれないなあ。 b & 0xFF (1) b は byte型、リテラル 0xFF は int型なので、論理積を計算する前に b が暗黙のキャストにより int型になります。 (2) b に格納されている値 0xC7 (-57) が 0xFFFFFFC7 (-57) になります。-57 という値は変化しませんが、byte から int に変換されたことによりビットパターンが変化します。負数の場合は、増えた桁数を 2進数の 1 で埋めなければならないので。 (3) リテラル 0xFF は int型なので、桁数が分かりやすいように表記すると 0x000000FF となります。 (4) 0xFFFFFFC7 & 0x000000FF の論理積を取るので結果が 0x000000C7 になります。 0x000000C7 は最上位ビットが立っていないことからも明らかなように正の数ですね。
たしかに、C のコードを移植するときなんかに欲しいなーと思うことが多いですね。 |
1