毎日新聞インターネットによる高校生小論文コンテストで最優秀賞をいただいたこうしろうであるが,当然,妻と私が一番気にしていたのは「副賞が何か」であった。スポンサーが冷凍めん協会なので,冷凍めん一年分かあるいは毎日新聞大学4年分かなどとくだらないことを言いあっていた。この脳天気な夫婦のほかに,日経ソフトウエア副編集長兼日経ITpro副編集長の道さんも副賞を気にしていたひとりだ。

11月30日 帰宅すると,こうしろうが副賞の富士通製ノートPCが届いたと言う。

 FMV-BIBLO NF60T,エントリー級ワイドノートという分類に入る機種らしい。Turion64 X2とあるようにAMDの64ビットプロセッサTurion64(テュリオン)のデュアルコア・モバイル・プロセッサを搭載している。無線LANはa/b/g全部に対応している。ディスプレイは15.4インチとかなりでかい。Windows Vista Capable PCだ。どんどん新しいCPUが出るように,新しい用語も生まれる。Capable(ケーパブル)は「有能な」とか「資格のある」という意味のようだ。ライターとしてこれでいいのかと思わないでもないのだが,近頃新しい用語はこうしろうに教えてもらうことが多い。メモリを倍くらい増量してやればVistaもいけるだろう。ビックカメラ有楽町店のお買い上げシールが,「ああ,誰かが買いに行ってくれたんだ」と感じられてうれしい。

 たしかに15.4インチのディスプレイはワイドである。キーボードは大きいほうが打ちやすいが,19mmピッチのキーボードの両側にこんなにたくさん余白があるのだ。タッチパッドの下には指紋センサーが付いており,Microsoft Office Personalも付いている。CPUをAMDにするとお得感の強いPCになる。

 「熱くならないか」なあとAMDにあまりいい思い出のない父子は心配になった。たぶん,改良されていることだろう。

 ひとしきり盛り上がった後,広げたPC をまたダンボールにそっと戻すこうしろう。「受験が終わってひまになったらインストールするわ」と殊勝なことを言う。「やっといてやろうか」とちょっかいを出すと「パーティションも切り直したいし,それから・・・」と話しが長くなりそうなので,一緒に片付けた。

 Turion64 X2でVisual Studio2005やEclipseを動かしたら速いだろうな,使ってみたいなと思ったが息子が我慢しているのだから致し方ない。

 12月2日 パソコンのインストールをする余裕はないこうしろうであるが,少ない時間を見つけ,C#の勉強は続ける。今日はBinaryReaderをつかったバイナリファイルの読み込みを行う。おおざっぱに言うと,FileStreamを使ってバイナリファイルを開き,BinaryReaderを作成してファイルを読み込む。FileStream,BinaryReaderともにSystem.IO名前空間に存在するので, using System.IO; を宣言しておく。

 バイト型の配列にファイルを読み込み,16進で表示する例を紹介しよう。

 3Dにくぼんだコントロールが16進でファイルの内容を表示するためのラベル,「何バイトまで表示しますか?」というラベルの右にあるのがnumericUpDownコントロール,スクロールさせて値を変化させることができるので,数値を指定したいときに便利だ。  openFileDialogを使って,ファイルを開くボタンをクリックしたら,ファイルを選択できるようにしている。

----------------------------------------------------------

private void button1_Click(object sender, EventArgs e)
{
 openFileDialog1.FileName = OpnFileName;
 openFileDialog1.Filter = "すべてのファイル(*.*)|*.*";
 if (openFileDialog1.ShowDialog() == DialogResult.OK)
  {
   OpnFileName = openFileDialog1.FileName;
   this.Cursor = Cursors.WaitCursor;
   LoadFile();
   DispBytes();
   this.Cursor = Cursors.Default;
  }
}

----------------------------------------------------------

 openFileDialog1のFilter(フィルタ)に*.*(すべてのファイル)を指定してダイアログを表示し,クラスの先頭で定義済みの変数OpnFileNameに取得したファイル名を入れている。BinaryReaderはバイナリだから,すべての種類のファイルを読むことができる。カーソルをWaitCursor(砂時計)に変えて,LoadFileメソッド,DispBytesメソッドの順で実行する。
----------------------------------------------------------

private void LoadFile()
{
 FileStream fs = new FileStream(OpnFileName, FileMode.Open);
 ByteData = new byte[fs.Length];
 BinaryReader br = new BinaryReader(fs);
 int count = 0;
 while (br.PeekChar() >-1)
 {
  ByteData[count] = br.ReadByte();
  count++;
 }
 br.Close();
 fs.Close();
 FileLen = count;
}

----------------------------------------------------------

 FileStreamでファイルを開き,ByteData = new byte[fs.Length];で必要な大きさのバイト配列を確保する。ByteData配列はクラスの先頭でサイズを決めず,Byte[] BytData;と宣言している。

 BinaryReaderのインスタンスbrを作成しReadByteメソッドで1バイトずつ配列に読み込んでいる。PeekChar メソッドはストリームの終端に到達すると負の値を返すので,そこで読み込みを終える。

 ラベルに16進で表示を行うのが,DispBytesメソッドだ。numericUpDownコントロールに指定したバイト数分ファイルの先頭から表示する。
----------------------------------------------------------

private void DispBytes()
{
 String DispData = "";
 int count = 0;
 if ( numericUpDown1.Value > FileLen){
  count = FileLen;
 }else {
  count = (int)numericUpDown1.Value;
 }
 for (int i = 0; i < count; i++)
 {
  byte b = ByteData[i];
  String s = String.Format("{0:X2} ", b);
  DispData += s;
 }
 label1.Text = DispData.ToString();
}

----------------------------------------------------------

 FileLenかnumericUpDown1.Valueの小さいほうの値をcountに代入して,0バイトから順にiがcountより小さい間,String.Format にX2と書式を指定することで16進の文字列にしてDispDataに連結している。

 numericUpDown1.Valueが10だとすると,0バイトからはじめて9バイトまでの10バイトを表示する。