• 締切済み

CRCについて

CRCの算出についてなのですが http://www2c.biglobe.ne.jp/~osakana/vc/pc/crc.html こちらのサイトを参考にすると 1. データを一つ(1バイト)とってきます 2. CRC値を左ビットシフトして、桁上がりがあればさらに生成多項式とXORを取ります 3. データを左ビットシフトして、桁上がりがあればCRC値と1のXORを取ります 4. あと7回(1バイト=8ビットなので)2と3を繰り返します 5. 残りのデータがあれば1に戻ります とあります。 例えばアドレス部00000000にデータ01が入っているもの(ファイルサイズ1バイト)を算出しようとした場合 手計算を行うとCRC16は0001、CRC32は00000001になりそうなのですが いくつかのフリーソフトで実際にバイナリエディタを用いて1バイトのファイルを作成し、試して見たところ CRC16が1E0E CRC32がA505DF1B と出ます。 一般的な算出方法では、上記の説明以外に何か別の処理、初期値などがあるのでしょうか? お分かりになる方是非教えてください。 よろしくお願いします。

  • mobit
  • お礼率14% (1/7)

みんなの回答

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

>4. あと7回(1バイト=8ビットなので)2と3を繰り返します の部分を見落としていると思います。 それと、最後にビットを反転しています。

mobit
質問者

補足

一応そこも考慮したうえでそのような計算結果になると思うのですが 1.データ1バイト取得0000 0001 2.1回目 データ:0000 0001 , CRC16:0000 0000 桁上がりなし 3.1回目 データ:0000 0010 , CRC16:0000 0000 桁上がりなし 以降7回目まではデータ部分のみ移動が起きるだけで桁上がりは無し 2.8回目 データ:1000 0000 , CRC16:0000 0000 桁上がりなし 3.8回目 データ:(1) 0000 0000 桁上がりあり CRC16:0000 0000と0000 0001のxorをとる CRC16:0000 0001になる こうなるのではないのでしょうか? またビット反転とのことですが 1111 1110となってもやはり答えとは違うと思うのですが… どこか未だ私に認識違いがあるようです。 引き続きよろしくお願いします。

関連するQ&A

  • CRCの計算方法について

    色々なサイトを参考にして、自分なりにCRC-ITU-TでCRCを計算する関数を作成しました。 いまいち理解が浅く、そのCRCの値が正しいのか判断できずに困っています。 以下にソースを載せます。 アドバイスを、どうかよろしくお願いします。 unsigned short Crc(unsigned char *Data, unsigned long num) {   unsigned short vCrc;    //CRCを計算する変数   unsigned char vData;   unsigned long i;   int j;   vCrc = 0;   vData = 0;   //初期化   for(i = 0; i <= num; i++){     vData = *(Data+i);   //1byte読み込み     for(j = 0; j < 8; j++){       //CRC計算変数がシフトで桁あふれする場合       if((vCrc & 0x8000) != 0){         vCrc = vCrc << 1;   //1bitシフト         vCrc = vCrc ^ 0x1021;  //多項式とXOR       }       else{         vCrc = vCrc << 1;       }       if((vData & 0x80) != 0){         vData = vData << 1;   //データ変数1bitシフト                 vCrc = vCrc ^ 0x0001;  //CRC計算変数に1をXOR       }       else{         vData = vData << 1;       }     }   }   return(vCrc); }

  • CRC16計算について

    CRC16のプログラムを作ったのでデバッグしていて気付いた事なのですが (産業装置で使うMODBUS-RTUのソフト) CRC16 x16+x15+x2+1 生成多項式 0xA001 CRC16でCRCを含めたデータを再CRCするとゼロになると言われておりますが そうならないのですが何故でしょう? もちろん、自分の作ったソフトが信用できないので他ソフトで検証 具体例 ベクターにあるCRC16の計算ソフト - CRC16.exe http://blog.goo.ne.jp/masaki_goo_2006/e/50b20edb79f60964faeaefe6fa064469 これに文字列"ABCD" [0x4142,0x4344]を入れて計算実行 出力結果  初期値:0xFFFF、出力XOR:0xFFFF、出力結果、右送り0x0F85 この出力を最初の文字列に追加する 0x4142,0x4344,0x0F85 結果は0xc7e6 となってゼロになりません やりかたが違うのでしょうか? 尚、私の作ったプログラムと上記ソフトの結果が同じです また、ネット上にある同様な他ソフトでも同じ結果でした (もちろんCRC計算条件が同じ物) 尚、上記ソフトで 初期値:0x0000、出力XOR:0x0000、左送り:9AA8 この場合のみCRC追加しての再CRCはゼロになりました ゼロになる場合とならない場合があるのでしょうか?

  • CRC32のデータ送りの方向について

     送信されてくるethernetフレームを受信しながらCRC32を計算し、 FCSチェックを実施するハード(VHDLによる)を作成しようとしています。  ハードの構成は、下記URL(の中程)のような、1bit単位でのxorにより実施しようと考えています。 http://homepage3.nifty.com/izushi/OTN/tn2/index.html  ethernetフレームで計算されるCRC32が、下記パラメータ、 (1)ビットシフト方向:右 (2)生成多項式:0xEDB88320 (3)初期値(0xFFFFFFFF) (4)出力XOR(0xFFFFFFFF) (5)フレームのLSB側(FCSデータが格納されている方)からデータ送り と一致することは判明し、検証も終わったのですが、 フレームはFCS側からではなく、MSB側(MACアドレス側)から転送されてくるため、 (5)と相反し、実装できません。 フレームのLSB側(FCSデータ側)からではなく、MSB側(MACアドレス側)から データを送り、(1)~(5)の条件で求めたCRC32の値を再現することはできるのでしょうか? 「CRC32」、「左送り」などで調べてみたのですが、 下記URLのように、MSB側(格納データのアドレス0側)から計算している例も あったのですが、CRC32の値が(1)~(5)パラメータで求めたものとCRC32の値が異なりました。 http://okwave.jp/qa/q5183760.html  要約すると、同一のデータを使用して、MSB側、LSB側から計算し、 同じCRC32の値となるようなパラメータの組み合わせが有るか無いか、 ということになると思うのですが・・・ よろしくお願いします。

  • CRCについて

    「あるmビットパターンに対する多項式表現をM(X)とする。このパターンをrビットだけ左方向にシフトし、右端のrビットに0を補完したビットパターン(m+rビットパターン)の多項式表現は、X^rM(X)になることを証明せよ。」という課題が出たのですが、どうしたら良いのでしょうか?

  • CRCチェック 多項式の選び方

    今、CRCチェックの多項式を何にすればよいか悩んでいます。多項式を選ぶ基準はあるのでしょうか?私は、マイコンのソフト設計を業務にしており、EEPROMにマイコン側で書き込んだデータが正しく、EEPROMから読み出しているかを確認する為にCRCチェックで確認をしようとしています。例えば、EEPROMの容量は1024BYTEで、各セクション=16BYTE(1セクション=16BYTE)単位で各セクションには、SHORT型もしくはCHAR型等のサイズは多種のデータが混在します。セクション単位でCRCチェックを実施しようと考えたいますが、CRCの多項式を選ぶ基準について御教示願いたいです。

  • CRC計算方法

    CRCの生成多項式によるmodulo2計算等については一通り調べて理解したつもりですが、実装するとなるとどうしたものかと止まってしまいます。 実装の要求が 「何バイトあるか不明なデータのCRCを計算する」 (CRC-16にて) です。 どなたかお知恵を拝借できないものでしょうか。

  • VB.NETで16bit符号なしを使いたい

    VB.NET(2003)でCRC計算を行うプログラムを作ろうと思ったのですが 生成多項式のXORを行う際にInteger型を使っていると64bit分XORを取ってしまうようでうまくいきません。 何かいい方法はないでしょうか? よろしくお願いします。

  • CRC8 ATMの計算方法

    CRC8 ATMの演算を行うツールの検証を行っているのですが、 CRCの机上計算方法を詳しく解説したサイトが無く生成多項式で 割って余りを求めると言う事しかわかりませんでした。 CRCを求める際はCRCの初期値も重要な筈ですが、CRCの初期値は 余りを求める際にどの様に使うのかを開設した物がなく、私に 検証を依頼してきた人に聞いてもまともな回答をもらえません でした(検証を依頼してきた人もちゃんと理解していない?)。 このサイトの別の質問の回答で 1. 与えられたデータの下位 (ビット送りの反対側) に「初期値」   を付加する 2. 生成多項式で割って余りを求める とあったので、その通りに計算しましたが初期値が0x00の時は ツールと机上計算の結果が一致するのですが、初期値0xFFの時は ツールと机上計算の結果が一致しませんでした。 実際の計算過程と結果は下記です。 生成多項式:x8+x2+x1+1(9'b100000111) 入力データ:0x12345678 CRC初期値:0x00 データ左送り、入出力反転なし 机上計算 初期値:0001001000110100010101100111100000000000(0x1234567800) 100000111 ---------------------------------------- 0001001000100010101100111100000000000 100000111 ---------------------------------------- 0001001010010101100111100000000000 100000111 ---------------------------------------- 0001011100101100111100000000000 100000111 ---------------------------------------- 0011101011100111100000000000 100000111 ---------------------------------------- 01101000000111100000000000 100000111 ---------------------------------------- 0101001110111100000000000 100000111 ---------------------------------------- 001001001111100000000000 100000111 ---------------------------------------- 0001000001100000000000 100000111 ---------------------------------------- 0000000010000000000 100000111 ---------------------------------------- 00000011100 なのでCRC(余り)は0x1C(00011100)でツールの結果0x1Cと一致。 CRC初期値:0xFF 机上計算 初期値:0001001000110100010101100111100011111111(0x12345678FF) 100000111 ---------------------------------------- 0001001000100010101100111100011111111 100000111 ---------------------------------------- 0001001010010101100111100011111111 100000111 ---------------------------------------- 0001011100101100111100011111111 100000111 ---------------------------------------- 0011101011100111100011111111 100000111 ---------------------------------------- 01101000000111100011111111 100000111 ---------------------------------------- 0101001110111100011111111 100000111 ---------------------------------------- 001001001111100011111111 100000111 ---------------------------------------- 0001000001100011111111 100000111 ---------------------------------------- 0000000010011111111 100000111 ---------------------------------------- 00011100011 なのでCRC(余り)は0xE3(11100011)でツールの結果0xCDと不一致 となりました。 これは計算の仕方が間違っているのでしょうか? それともツールの結果が間違っているのでしょうか? 何方かCRCの計算に詳しい人、ご回答をお願いします。

  • CRCアルゴリズムのZ/2Z上の多項式の係数列とは?

    こんにちはお世話になります。 私はネットワークに興味があるオジサンです。 先日、データリンク層のプロトコル群を勉強していたとき、誤り訂正でCRCが出てきました。 CRC(Cyclic Redundancy Cheak)の解説には、 >ビット列をZ/2Z上の多項式の係数列とみなし, もとのデータにチェックビットを 継ぎ足して必ず特定の生成多項式で割り切れるデータのみを送るようにする. > とありました。 上記の「Z/2Z上」とは何を指しているのでしょうか。 数学が大の苦手ですので優しく解説していただければ幸いです。 何卒よろしくお願い申し上げます。

  • バイナリファイルをバイト単位でアクセスするには?

     大サイズのバイナリファイルに対して、perlでチェックサムを調べたりCRCチェックをかけるプログラムを作成したいと考えています。従って、そのバイナリファイルからバイト単位でデータを取り出して、計算するということをしなければならないのですが、いちばん基本的なところの、『バイナリファイルからバイト単位で順番にデータを取り出す方法』がわかりません。  よろしくお願いします。

    • ベストアンサー
    • Perl