- PR -

バイナリファイルのbyte→int変換

1
投稿者投稿内容
oki
ベテラン
会議室デビュー日: 2004/12/18
投稿数: 55
投稿日時: 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 ]
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-10-13 19:43
コード:
byte b = (byte)0xc7;
System.out.println(b);
System.out.println(b & 0xff);


こんなんでどうでしょう。
oki
ベテラン
会議室デビュー日: 2004/12/18
投稿数: 55
投稿日時: 2005-10-13 21:44
ご返信ありがとうございます。

なるほど、b & 0xff とすればいいのですね。
でも、& 0xffするのはどういう理由からでしょうか?
よろしくお願い致します。


コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-10-13 21:47
Java でも unsigned 付けられるようにすべきでしょう。。。
Sun Microsystems は (プ
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-10-14 02:02
引用:
でも、& 0xffするのはどういう理由からでしょうか?


これを説明するのは結構ムズカシイかもしれないなあ。

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 は最上位ビットが立っていないことからも明らかなように正の数ですね。

引用:
Java でも unsigned 付けられるようにすべきでしょう。。。


たしかに、C のコードを移植するときなんかに欲しいなーと思うことが多いですね。
1

スキルアップ/キャリアアップ(JOB@IT)