piapia123
ja

CRC-16 チェックサムの計算

エンコード

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

テキストの CRC-16 チェックサムを求めます。CRC-16 は産業機器や組み込みの現場では CRC-32 より頻繁に現れます —— Modbus のフレーム末尾2バイト、1-Wire デバイスの ROM チェックサム、Bluetooth や X.25 のフレーム検査がすべてこれを使っています。そして、これが最も変種の多い一族でもあります:0x8005 や 0x1021 といった1つの多項式に、異なる初期値・ビット反転の有無・最終 XOR 値を組み合わせると、30を超える互換性のないアルゴリズムが生まれ、しかも算出される数値は互いに無関係です。ここではよく使われる9つを収録し、それぞれに用途と出所を添えています。切り替える前に、相手側がどれを期待しているかを必ず確認してください —— CRC 系のツールが最も間違えやすく、最も原因を突き止めにくいところです。

機能

  • よく使われる9つの変種:ARC・Modbus・USB・MAXIM・CCITT-FALSE・XMODEM・KERMIT・X-25・DNP
  • 各変種に用途を明記 —— Modbus のフレーム、1-Wire デバイス、X.25 のフレームでそれぞれ別のものを使います
  • 出力は16進数(大文字・小文字を切替可)または10進数
  • 日本語は UTF-8 バイトで計算し、他の実装と一致します
  • 各変種はパラメータ目録の check 値に固定されているので、パラメータの写し間違いが起きません
  • 計算は端末内で完結し、内容がアップロードされることはありません

使い方

  1. 入力欄に内容を貼り付けると、結果がリアルタイムで表示されます
  2. 相手のシステムに合わせて変種を選びます(Modbus なら CRC-16/MODBUS)
  3. 必要に応じて16進数/10進数、大文字を切り替えます
  4. 「コピー」でチェックサムを取り出せます

よくある質問

CRC-16 にこんなに変種があるのはなぜですか?
CRC-16 の「16」はチェックサムが16ビット幅であることしか定めておらず、それ以外は何も決めていないからです。どの多項式を使うか、初期値は何か、入力バイトをビット反転するか、結果に定数を XOR するか —— この4つのパラメータは長年にわたり各ベンダーが独自に決めてきたため、同じ名前の下に数十の互換性のない実装が生まれました。ARC(IBM とも呼ばれます)が最初で、Modbus・USB・X-25 はいずれもそれを各用途向けに変えたものです。名前では見分けがつかないため、ここでは全項目に用途を添えています。
Modbus が使うのはどれですか?
CRC-16/MODBUS です:多項式 0x8005、初期値 0xFFFF、入出力ともビット反転、最終 XOR なし。Modbus RTU のフレームでは末尾2バイトがこれで、下位バイトが先に来ます。なお Modbus TCP はこれを使いません(下位のイーサネット層が完全性を担います)。手で計算が必要なのは RTU と ASCII モードだけです。
相手のシステムがどの変種を使っているかは、どう調べますか?
信頼できる順に3つあります。第一にプロトコル仕様書で、通常は多項式と初期値が明記されています。第二に既知の検証値で、標準的な検査入力は文字列 `123456789` です —— 本ツールの各変種は CRC パラメータ目録に登録された値と一致するので、順に試して合致したものが答えです。第三にソースコードで、0x8005 をビット反転した 0xA001 がコード中にあれば、まず ARC 系と確定できます。
マニュアルの値と一致しないのはなぜですか?
ほぼ2つの原因です。ひとつは変種の選択ミス —— 同じ 0x8005 でも ARC は BB3D、Modbus は 4B37、MAXIM は 44C2 になります。もうひとつはバイト範囲の取り違えです。CRC はバイト列に対して計算するので、こちらのデータ部だけを貼り付け、相手が「アドレス+機能コード+データ」のフレーム全体で計算していれば、一致するはずがありません。両者の入力範囲が完全に同一か確認してください。

関連ツール