flat7th

memo/20120507

created 2012-05-07 modified 2012-05-27 

正しいCRC計算アルゴリズムがわかりません、ていう話。

リンク備考
おおもとの仕様?
CRC16-CCITT
BOOST CRCBOOSTの「16ビットCRC-CCITT」は、上記サイト(www.JoeGeluso.com)が「間違っている」と主張する値を返します。
通信用語の基礎知識 CRCキャリーフラグを使ったレジスタ間ビット移動(ローテート)とか、マシン語前提の説明になってるけど、日本語で正しそうなサイトってここしか見つからなかった

連休に検証しようかと思ったけど遊んでたから未完アヒャヒャ(汗


CRCの計算というのはいろんなとこに出てくる。イーサネットとか。

んで、あるハードの制御に16ビットのCRC値計算(初期値(FFFF)h、多項式が X16+X12+X5+X0 = 0x11021 ≒ CRC計算上は 0x1021 でも可)が必要になったんだけど、

正しいアルゴリズムがどれなのか、よくわからん、という話。

上記リンクの2番目の人は、「正しい」アルゴリズムと「間違った」アルゴリズムの2つを示している。

で、試行錯誤の結果、今いじってるハードは、上記サイトの「間違った」アルゴリズムを使ってることがわかった、のです。


で、Boost にも CRC計算のライブラリ があるみたいなんだけど、これもどうやら上記サイトの言う「間違った」アルゴリズムの値になる。

("123456789"という文字列に対して、www.JoeGeluso.com は正しいCRC値は 0xE5CC だと言っている。BOOSTのCRCライブラリは 0x29B1 を返す。)



まぁ、今回は目的のハードが動けばいいんだけど、自分が仕様を書くときには 16ビットCRC CCITT方式、というだけだと(間違ったアルゴリズムだけど世に多く出回っているから主導権を握っているほうをつかっているのか、否か)混乱のもとだから、サンプルソースまでつけて明確にしよう、と思った、という話。

サンプルソースつけなくても、"123456789"に対し何を返すアルゴリズムなのか、を示せばだいぶ助かるね...。