素人老人は今回Pharo様にCRC計算してね、とお願い。当然ながらPharo様はCRCを計算できるクラスを持ってます。それにお願いするか「継承」すればよい筈。しかしね、CRCといってもいろいろアリ。デフォルトで計算できるCRC16とかCRC32とかは何なの?「違う奴」はどうしたら良いの?分からんことだらけだな。
※Pharo関係記事の投稿順Indexは こちら
※Smalltalkの法灯を継ぐモダンな処理系Pharo様を練習してます。今回の動作確認には、Windows11上のWSL2の上のUbuntu24.04LTS上のPharo 10.0.0を使用しています。
今回参照させていただいたCRC計算機
CRCは古典的な冗長検査のコードでアチコチで広く使われてますが、結構、メンドイ輩じゃないかと思います。どれも遠くからみたら「一緒」なんだけれども、ビット幅、生成多項式の違いなど「アカラサマ」な部分から、初期値がいくらだ、といったコマケー話まで、各種規格、各社各製品で採用されているパラメータがバラバラなためです。そこで以前から、「CRC」を計算せん、とするときにお世話になっておりますのが、以下のウエブ上のページです。
このページが便利なのは、各種規格、各社名などで呼ばれるCRCの変種をプルダウンメニューより引き出せばそのパラメータが分かるだけでなく、サンプルデータを打ち込んで結果を得ることができるからです。
Pharo様のCRCクラス
System-Hashingパッケージの配下のChecksum傘下に、CRCクラスが存在していました。「汎用」のクラスであり、設定すればいかなるCRCでも計算してくれそうな雰囲気を醸してます。しかし自前のデータの検査に何でもよいからCRCを計算したいという「ニーズ」のためなのか、何も設定せずともデフォルトでCRC16とCRC32を計算できるようになってました。
一撃で文字列のCRCを計算できてうれしいのだけれども、このCRCってどんなパラメータのやつ?
なんでも包み隠さず開示してくれるPharo様なので、CRCクラスの中のメソッドなどを眺めれば明らかです。上記のCRC16の設定が以下に。
どちらの設定も、CRC16、CRC32といって「何も言わなかったときに」多分適用されるべきパラメータであるようです。
CRC16の方は、上記のサイトではCRC16/ARCというお名前で参照できます。実際に上記の処理例を計算してもらった結果が以下に。
Pharoで計算した結果と緑のマーカ部分が一致しましたな。なお、このCRC16/ARCのARCは米国のAviation Rulemaking Committee様なのかな?知らんけど。また、自動車業界に起立するAUTOSAR様のClassic Platformという規格内でも使われているみたい。お惚け老人には、LHAで使われているやつ、というのが一番親しみあるかも知れんとです。
こちらもイケてるみたい。
ただね、CRCのパラメータ、ほんといろいろデス。同じ会社でも違う製品になるとまた違ったりして。。。そのときチョイと引っかかったのが、CRCクラス内で参照している以下です。
CRCを高速に計算するための表引きテーブルね。もしかして、パラメータを変えたいときには、こいつをイチイチ設定してやらんとならんの?メンドクセー。と思ったら、Classのコメントに書いてあったではないですか。1か所引用させていただきます。
#lookupTable: the only OPTIONAL parameter. The lookup table will be generated at runtime if none has been supplied
あれば使うけど、なければ自前で計算してくれるみたい(当然時間はかかるのだろうけれど。)これなら、アリガチなパラメータのみ設定してやればOKのハズ。
試みにCRC16でもチョイと別なパラメータの奴をウエブ上で計算してもらいました。CRC16_CCIT_ZEROとな。泣く子も黙る(今は別なお名前だから黙った?)CCITTにもいろいろあるみたいね。
上記のパラメータに、同じ文字列を食わせると上の緑マーカのような値がCRC16値となるみたいです。
上記と同じ計算をPharo様にお願いしてみます。こんな感じ。
右のインスペクタ画面のhexのところを見ると、確かに BE0F となっとります。念のため、lookupTable: メソッドに nil 渡してます。さすれば表引きテーブルは自前で計算してくれてるみたい。
このクラスを使えば、ひねくれ者の多いちんまいCRC8類も計算できるのか?ほんとセンサチップ毎に違っていたりしてメンドクセー奴らが多いのだが。