MCPで接続 →

計算を入力してください

公式

広告

結果

CRCチェックサム(16進数)
0x29B1
16-bit checksum
10進数の値 10,673
ビット幅 16 bits
処理バイト数 9

CRCチェックサムとは?

巡回冗長検査(CRC:Cyclic Redundancy Check)は、ネットワーク通信やストレージ、各種ファイル形式(Ethernet、ZIP、PNG、Modbus、USBなど)で広く使われている誤り検出符号です。データを一つの長い2進数とみなし、あらかじめ決められた生成多項式で、桁上がりのない2進演算(GF(2):加算も減算もXORで行う)を使って割り算します。その割り算の余りがCRCの値です。メッセージのたった1ビットが変化しただけでも、余りはほぼ確実に変わります。これこそが、CRCが通信エラーやデータ破損の検出に優れている理由です。

メッセージをデータと付加されたCRCチェックサムフィールドに分割したブロック図
CRCはデータに短い検査値を付加し、エラーを検出できるようにします。

この計算ツールの使い方

入力欄に任意のASCIIテキストを入力し、使用したいCRCの種類を選ぶと、結果が表示されます。チェックサムは16進数と10進数の両方で表示され、あわせてビット幅と処理したバイト数も確認できます。対応している代表的な3種類は次のとおりです。

CRC-8 — 多項式 \(\mathtt{0x07}\)、初期値 \(\mathtt{0x00}\)。
CRC-16/CCITT-FALSE — 多項式 \(\mathtt{0x1021}\)、初期値 \(\mathtt{0xFFFF}\)、ビット反転なし。
CRC-32(IEEE 802.3) — 反転多項式 \(\mathtt{0xEDB88320}\)、初期値 \(\mathtt{0xFFFFFFFF}\)、最終XOR \(\mathtt{0xFFFFFFFF}\)。ZIPやgzip、Ethernetで使われているのがこのバリアントです。

$$\text{CRC} = \mathrm{XorOut} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}_{\text{poly}}(\text{crc}, b)$$

$$\text{where (CRC-16/CCITT-FALSE)}\quad \left\{ \begin{aligned} \text{poly} &= \mathtt{0x1021} \\ \mathrm{init} &= \mathtt{0xFFFF} \\ \mathrm{XorOut} &= \mathtt{0x0000} \\ \text{width} &= 16 \text{ bits (MSB-first, no reflection)} \end{aligned} \right.$$

計算の仕組み

概念的には、メッセージ \(M(x)\) に \(x^n\)(\(n\) は生成多項式の次数)を掛け、それを生成多項式 \(G(x)\) で割ります。実際の処理では、1ビットずつシフトするレジスタを用い、先頭ビットが1のときに多項式をXORで取り込んでいきます。CRC-32のような反転(リフレクト)バリアントでは、ビットを下位ビットから処理し、左ではなく右へシフトします。

$$\text{CRC}_{16} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b)$$

$$\text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFF} \\ \text{poly} &= \mathtt{0x1021} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 16 \text{ bits, MSB-first} \end{aligned} \right.$$

$$\text{CRC}_{8} = \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b)$$

$$\text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0x00} \\ \text{poly} &= \mathtt{0x07} \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \ll 1\big) \oplus (\text{MSB}?\,\text{poly}:0) \\ \text{width} &= 8 \text{ bits, MSB-first} \end{aligned} \right.$$

$$\text{CRC}_{32} = \mathtt{0xFFFFFFFF} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}(\text{crc}, b)$$

$$\text{where}\quad \left\{ \begin{aligned} \mathrm{init} &= \mathtt{0xFFFFFFFF} \\ \text{poly} &= \mathtt{0xEDB88320}\ (\text{reflected}) \\ \text{step} &: \text{crc} \leftarrow \big(\text{crc} \gg 1\big) \oplus (\text{LSB}?\,\text{poly}:0) \\ \text{width} &= 32 \text{ bits, LSB-first} \end{aligned} \right.$$

XOR演算を用いてGF(2)上でメッセージのビットを生成多項式で割る多項式の筆算
CRCは、メッセージを生成多項式 \(G(x)\) で二進多項式除算(XOR)した余りです。

計算例

定番の検証用文字列 123456789 の場合、CRC-16/CCITT-FALSE は 0x29B1(10進数で \(10673\))、CRC-32/IEEE は 0xCBF43926(10進数で \(3421780262\))を返します。これらはCRCのリファレンスカタログに掲載されている標準的な「チェック値(check)」なので、自作の実装が正しく動作しているかを照合する基準として利用できます。

よくある質問

他のツールと結果が違うのはなぜ? CRCのバリアントは、多項式・初期値・ビット反転の有無・最終XORがそれぞれ異なります。比較する際は、まったく同じバリアント同士であることを必ず確認してください。

CRCは安全なハッシュとして使える? いいえ。CRCは偶発的なエラーを検出できますが、意図的に偽造するのは簡単です。セキュリティ用途にはSHA-256などを使用してください。

どの文字エンコーディングが使われる? 各文字は、CRCを計算する前に8ビットのASCII/Latin-1のバイト値として扱われます。

最終更新: