import java.io.*;
public class ReadFile {
public static void main(String argv[]) throws Exception {
ReadFile rf = new ReadFile();
rf.execute("C:/Test.txt");
}
public void execute(String readFile) throws Exception {
DataInputStream in =
new DataInputStream(new FileInputStream(readFile));
for(int i=0;i<7;i++){
System.out.print(
Integer.toString(in.readByte(), 16).toUpperCase());
if(i < 6) System.out.print(",");
}
in.close();
}
}
[実行結果]
-1,-66,76,-69,-1E,6A,19
↑再び、何じゃこりゃあぁ!!
バイトデータ。よくよく考えると Java の byte 型は符号つき整数(-128〜127)なので 255 なんて設定されるはずが無い。255 を設定すると 127 を飛び越えて -128 はじまりになり、結局255番目の位置は -1 となるのである。この -1 を2進数で表すと 1 に対する2の補数ということで 11111111 となる。そして主役の数の 255 を2進数で表すと 11111111 となる。ということは…、-1 から 255 を算出せしめるためには 11111111(2)(=-1) と 11111111(2) の論理積を求めれば 11111111(2)(=255) となるので、それでまあよろしいのかなと予想がつく。
じゃあ 128 を考えよう。2進数だと 10000000 となる。だが Java では最大値が 127 なので 127 を飛び越えて -128 として保持される。-128 を2進数で表すとこれまた 10000000 となる。んじゃ -128 から 128 を取得したい場合はどうすればよいか。今度はきちんと数式を書くとしよう。以下の通り、
10000000(2) × x = 10000000(2)
となって、結局 x = 11111111(2) = FF(16) という解が求まる。これが結論。それじゃ上記ロジックを治療しませう。
import java.io.*;
public class ReadFile {
public static void main(String argv[]) throws Exception {
ReadFile rf = new ReadFile();
rf.execute("C:/Test.txt");
}
public void execute(String readFile) throws Exception {
DataInputStream in =
new DataInputStream(new FileInputStream(readFile));
for(int i=0;i<7;i++){
System.out.print(
Integer.toString(in.readByte() & 0xFF, 16).toUpperCase());
if(i < 6) System.out.print(",");
}
in.close();
}
}
[実行結果]
FF,9A,76,97,E2,6A,19
↑うむ、景観じゃ!!
|