Pharoといっしょ(8) PharoでCRCを計算する小ネタ

Joseph Halfmoon

素人老人は今回Pharo様にCRC計算してね、とお願い。当然ながらPharo様はCRCを計算できるクラスを持ってます。それにお願いするか「継承」すればよい筈。しかしね、CRCといってもいろいろアリ。デフォルトで計算できるCRC16とかCRC32とかは何なの?「違う奴」はどうしたら良いの?分からんことだらけだな。

※Pharo関係記事の投稿順Indexは こちら

※Smalltalkの法灯を継ぐモダンな処理系Pharo様を練習してます。今回の動作確認には、Windows11上のWSL2の上のUbuntu24.04LTS上のPharo 10.0.0を使用しています。

今回参照させていただいたCRC計算機

CRCは古典的な冗長検査のコードでアチコチで広く使われてますが、結構、メンドイ輩じゃないかと思います。どれも遠くからみたら「一緒」なんだけれども、ビット幅、生成多項式の違いなど「アカラサマ」な部分から、初期値がいくらだ、といったコマケー話まで、各種規格、各社各製品で採用されているパラメータがバラバラなためです。そこで以前から、「CRC」を計算せん、とするときにお世話になっておりますのが、以下のウエブ上のページです。

CRC Calculator (Javascript)

このページが便利なのは、各種規格、各社名などで呼ばれるCRCの変種をプルダウンメニューより引き出せばそのパラメータが分かるだけでなく、サンプルデータを打ち込んで結果を得ることができるからです。

Pharo様のCRCクラス

System-Hashingパッケージの配下のChecksum傘下に、CRCクラスが存在していました。「汎用」のクラスであり、設定すればいかなるCRCでも計算してくれそうな雰囲気を醸してます。しかし自前のデータの検査に何でもよいからCRCを計算したいという「ニーズ」のためなのか、何も設定せずともデフォルトでCRC16とCRC32を計算できるようになってました。

まずはデフォルトのCRC16計算例。ExampleCRC16

 

つづいてCRC32計算例。ExampleCRC32

一撃で文字列のCRCを計算できてうれしいのだけれども、このCRCってどんなパラメータのやつ?

なんでも包み隠さず開示してくれるPharo様なので、CRCクラスの中のメソッドなどを眺めれば明らかです。上記のCRC16の設定が以下に。PharoCRC16

CRC32は以下に。PharoCRC32

どちらの設定も、CRC16、CRC32といって「何も言わなかったときに」多分適用されるべきパラメータであるようです。

CRC16の方は、上記のサイトではCRC16/ARCというお名前で参照できます。実際に上記の処理例を計算してもらった結果が以下に。CRC16

Pharoで計算した結果と緑のマーカ部分が一致しましたな。なお、このCRC16/ARCのARCは米国のAviation Rulemaking Committee様なのかな?知らんけど。また、自動車業界に起立するAUTOSAR様のClassic Platformという規格内でも使われているみたい。お惚け老人には、LHAで使われているやつ、というのが一番親しみあるかも知れんとです。

CRC32での計算が以下に。CRC32

こちらもイケてるみたい。

ただね、CRCのパラメータ、ほんといろいろデス。同じ会社でも違う製品になるとまた違ったりして。。。そのときチョイと引っかかったのが、CRCクラス内で参照している以下です。CRC16table

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_CCIT_ZERO_JV

上記のパラメータに、同じ文字列を食わせると上の緑マーカのような値がCRC16値となるみたいです。

上記と同じ計算をPharo様にお願いしてみます。こんな感じ。CRC16_CCIT_ZERO

右のインスペクタ画面のhexのところを見ると、確かに BE0F となっとります。念のため、lookupTable: メソッドに nil 渡してます。さすれば表引きテーブルは自前で計算してくれてるみたい。

このクラスを使えば、ひねくれ者の多いちんまいCRC8類も計算できるのか?ほんとセンサチップ毎に違っていたりしてメンドクセー奴らが多いのだが。

Pharoといっしょ(7) 工夫の無い数値積分でπ(パイ)を計算してみる へ戻る

Pharoといっしょ(9) 続 CRC、CRC8/AHT21B、CRC8/DVBS2の計算 へ進む