■■ 32bitCRCに基づいたファイル・チェッカ(CRC32) ■■  =1. 能書き=  PC-E500 シリーズのポケット・コンピュータのファイルはタイムスタンプがつかないので、ファイル名が同じだと見た目で新旧の区別がまったくつきません。ファイルサイズが違っていればまだ救いようがありますが、そういうものばかりではないでしょう。こういうときにファイルごとにIDのような固有の値が割り当てられていて、それを比較することによって二者を区別を行なうことができれば便利です。  このプログラム「CRC32 」は巡回符号理論を用いて対象とするファイルについて32bit の固有の値(チェック・コード)を求めるプログラムです。CRC (Cyclic Redundancy Check) のチェック検出能力についてはISH などのツールやOS-9のモジュールの健全性チェックなどで実証済みですから今更説明するまでもないでしょう。  特にポケット・コンピュータではいまだに雑誌などのリスト(機械語・BASIC の)からプログラムを”手で”入力したりしていますが、このときに同時にそのプログラムのチェック・コード値が提示してあればリストの入力後に、提示された値と計算結果を比較することでチェックサムとは比べものにならない程高い信頼性をもたせることができます。  また、不用意な操作によって破壊された可能性のあるファイルも、事前にチェック・コードが求めてあれば操作後の値と比較することによってその同一性を確認することができます。  というわけでCRC チェッカが1つあればその分別能力からして、ファイルごとに背番号をもたせるのとほとんど同値になりますから何かと便利なのではないかと思います。  =2. 内容=  このパッケージには ●CRC32.ESP  …ソースプログラム(ESPRIT 用) ●CRC32    …実行形式(上記をコンパイルして得られたもの) ●README.DOC …いま見ているもの が入っています。なお、 ●CRC32.ESP: CRC32=6922d191, 5891bytes ●CRC32   : CRC32=5bddb453, 4852bytes です。  =3. 使い方=  $BB000〜が機械語エリアになるように設定してあり、すでに何らかの方法で実行形式がメモリにロードしてあるものとします。起動は   CALL &BB000 です。"Filename:" と聞いてくるのでファイル名を入力するとチェック・コードを計算します。6Kbytes 程度のファイルで10秒ほどかかりますが、計算しおわると   CRC32=xxxxxxxx, yyyyybytes というように16進8 ケタ(=32bit) のチェック・コード(xxxxxxxx)とファイルサイズ(yyyyy) を表示して終了します。  =4. 応用例=  能書きでも書きましたが ●バイナリファイルのバージョン管理 ●入力したリストの照合(リストにもCRC32 の値が記述してないと無理ですが) ●壊れているかもしれないファイルの検査 ●その他、ファイルの同一性の確認が必要な場所 等に利用するとたいへん便利です。  =5. プログラムについて=  ソースはESPRITで記述しました。特に難しいことはやっていないので簡単にわかると思います。アルゴリズムは[1]を参考にしました。ただ、PC-E500 シリーズの計算機のfgetc が信じられないほど遅いのでfgetc2という関数を自作しました。やっていることは単にファイルから4096bytes をブロックリードしてきて、それを呼ばれるたびに1bytesづつ切り出して返しているだけですが、この自前のバッファリングによって5倍強も処理が高速になりました。CRC の計算速度自体は限界に近いと思います。これ以上速くするためには計算部分をinline文で展開するしかないでしょう。  それから、ファイル名の入力を対話形式でおこなわずにコマンドラインから入力できるようにすればもうすこし使い勝手がよくなるのではないでしょうか。JM2WGNさんの作られた関数をインクルードすれば簡単にできると思うので試してみてください。  =6. 改良点など= ●ファイル名入力の簡単化(上記参照) ●処理の高速化(上記参照)  =7. 提案=  ファイルを公に放出する場合にはCRC ファイル・チェッカで得られた値を同時に提示しましょう。特に、雑誌などに掲載されたプログラムについて不都合が生じた場合などにバージョン違い・打ち間違い・環境の不整備などと、バグなどの本質的な問題とを区別するのになくてはならないものになると考えられます。  =8. 配布のための条件=  配布に際しては、このパッケージを改変する事無く行なってください。実行形式のみの配布などはご遠慮ください。譲渡もこれに準じます。配布・転載・譲渡は大歓迎です。  =9. 参考文献= [1]くさかべ@dit,「CRC.LZH」,from JUNET [2]工学社,[PC−E500・1480U活用研究] -- (c)1991 /近 成人(JK1OSG) E-Mail: JK1OSG @ JR1YTD(FWD), kon@cs.titech.ac.jp(JUNET)