Chapter Sixty seven

第67話


さて、ずいぶん久しぶりのような気がする。ハフマン圧縮やCRC32などの下準備ができたので、今回はZIP形式のファイルを作ってみよう。

そう思って、ヘッダーを見ていったら、ファイル作成の日時はノーマークだったことに気がついた。調べてみると、これはMS-DOS形式で年月日を2バイト、時刻を2バイトで表現していることが分かった。LabVIEWではGet Date/Time In Seconds関数で1904年1月1日から経過した秒数を倍精度実数で表示してくれる。

しかし、GetDate/TimeString関数は、プラットフォームや設定で表示がかわってしまいそうなので使うのはやめて、SondsToDate/Time関数を使うことにした。MS-DOS形式は年月日を2バイトであらわし、上位7ビットが1980以降の年数、次の4ビットが月、下位の5ビットが日になっている。時刻は上位の5ビットが時、次の6ビットが分、下位の5ビットが秒を2で割ったものになっている。素直に結線すれば次のようになる。

ZIP形式は複数のファイルをまとめて扱えるため、ファイルの新規作成、追加、削除などの手順を考えなければならないのだが、始めは新規に1個のファイルを圧縮する機能だけで作ってみよう。ヘッダーをきちんと付ければ一般的な圧縮プログラムで伸長することができる。ヘッダーの構造は、第57話で説明した通りだ。インテル形式への変換は、リバーシブル?なので変更無しで使える。

testLVZIP_W.viは圧縮したい文字列を入力して、zipファイルを新規に作成するVIだ。

ヘッダーを作ってファイルに書きだすだけといったVIで、見かけはシンプルなのだが、どこで圧縮しているのか分からないのが欠点だ。圧縮のサブVIはLocal Headerの中に入れてしまったので、Compress&LocalHeader.viなどのような名前にしたほうが良かったと思う。このVIを実行するとOriginal Stringに入力されている文字列を、File Nameに書かれている名前のファイルとして圧縮する。ZIPファイルを伸長するとこのファイル名の書類が現れる。ZIPファイルとしての保存ファイル名はダイアログで指定する。

LocalHeader.viはTime&Date.viやCRC32.viなどとともに固定ハフマン圧縮のviをサブVIとして使っている。圧縮の部分にバグが2個あって手直しが必要だった。これでもうバグはないとは思えないのでもう少し使ってみないといけない。でも、少なくともOriginal Stringにデフォルトで設定した文字列は、汎用ZIPプログラムで伸長することができることが確認できた。

こうしてみると、LabVIEWでのファイル入出力はすごく簡単であることを再認識してしまう。クラスターでも文字列でも数値配列でも気にせずワイヤリングすればディスクに記録されるのはすばらしいな。

そろそろ圧縮伸長プログラムの完成した姿を想像しなければならないのだが、その前にパフォーマンスを確認しよう。Zipの仕様書全体では32kをオーバーして正しく動作しないので、適当にカットして26Kの文書をOriginal Stringに貼り付けて実行すると圧縮後は11kぐらいで圧縮率は57%なのでまあまあの圧縮性能のようだ。

時間はプロファイルで調べると10秒弱かかっている。大部分は6千回ぐらい動作するviで占めているので、チリも積もれば山となる、的な状況で、工夫次第ではもう少し速くなるかもしれない。用途しだいで使い物になりそうな気がするのだが、どうだろうか?

LabVIEWの中で圧縮ができるのが特徴なので、測定日時と測定条件を書いたクラスターとU8やU16の配列が記録されていく圧縮サブVIというのはどうだろうか? 記録用サブVIは新規作成と追加のみの機能があれば良くて、読み出しと削除は別の管理サブVIにしてみよう。汎用のZIPプログラムで開いたときにも読めるようにするにはスプレッドシート型の文字列にしておいたほうがよいが、ファイルがでかくなるのでは圧縮するプログラムとしては価値がなくなる。

そんなことをしばらく考えながら、プログラムを作ってみよう。具体的なニーズのある人は大橋まで連絡してくれると助かる。

See you!


Nigel Yamaguchi

戻る