日々

TSファイルをいじるプログラムは、読むだけなら不要だってことでこれまで避けてきたCRC-32の計算方法を調べてみた。端的に言えば、Wikipediaの巡回冗長検査(CRC)にCRC-32の実装例が載ってるので、これの生成多項式を反転させない場合の実装例がそのまま使えた。
セクションの先頭からセクションの末尾のCRCの直前までのCRCを求めると、ちゃんとセクションの末尾のCRCと一致したし、セクションの先頭からセクションの末尾(CRC含む)のCRCを求めると、ちゃんと0になった。
今回使った実装例では予めmake_crc_table関数でcrc_tableの256個の配列に値を生成しておくんだけど、BonTestやepgdump等では256個の配列に初期値として生成された値を設定した上で、同じロジックでCRCを求めていた。
これで使えるソースは入手できたが、そもそも論でCRC-32とはどうやって計算するのかが分かってないのでARIBの資料やWikipediaの説明などを延々と読む。どちらにもCRC-32の場合の多項式(生成多項式)なるものが出てきて、数学用語ばかりで理解が出来なかったが、これはCRC-32を求める式ではないと判明(滝汗)
データをビット単位ですべてまとめた1つの値を定数で割った余りがCRCらしく、その定数はCRCの規格によって異なるようで、CRC-32の場合は0x04C11DB7らしい。で、さっきの式はこの定数を求めるためのものだと判った。
さらに多項式のxの32乗+xの26乗+…+xの2乗+x+1ってのは、2進数なのでxは2で、32乗は32ビット目が1であることを示していると判った。最終的にCRC-32の場合の定数は32ビットで表されるので最上位ビット(32ビット目)の1は無視される(捨てられる?)ことになる模様。
これで定数については判ったので、あとは計算方法の理屈だけだ。
定時後、軽く残業&CRC絡みの確認で30分ほど遅くなったけど、第二神明で帰宅。晩御飯はさばの塩焼きと高野豆腐。
PERSONA5見始めたところで急激な眠気に襲われてそのままソファで横になって寝る。夜遅くに起こされて布団で寝直す。深夜にやっとこさ眠気が取れたのでシャワー浴びてから再度就寝。