• ベストアンサー

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); }

質問者が選んだベストアンサー

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

そうなんですか^^ 失礼しました。以下のコードを実行すると boost のライブラリで計算したもの、Ru-LaLaさんのコードで計算したもの、サンプル実装で計算したものを比較すると、Ru-LaLaさんので計算したものだけ値が違うので、Ru-LaLaさんのコードが間違ってる可能性があるような気がします^^; サンプルコードは、  http://page.freett.com/seaside/vip/crc/ProgramC1.htm から取りました。サンプルコードをパクってしまえばいいのでは?(笑) ==== #include <iostream> #include <boost/crc.hpp> unsigned short ProgCrc1(unsigned char* Data, unsigned long StartAdr, unsigned long StopAdr) { unsigned short vCRC; /*CRCを計算する変数*/ unsigned char vData; /*CRC計算時に1データ読み込む変数*/ /*初期化*/ vCRC = 0; vData = 0; /*CRC書き込み位置の初期化*/ *(Data + StopAdr + 1) = 0; *(Data + StopAdr + 2) = 0; /*CRC-ITU-Tの計算*/ for(unsigned long Loop1=StartAdr; Loop1<=StopAdr+2; Loop1++) /*CRC書き込み位置までループ*/ { vData = *(Data + Loop1); /*1Byte読みこみ*/ /*CRC1Byte計算*/ for(char Loop2=0; Loop2<8; Loop2++) {/*CRC計算変数がシフトで桁あふれするか確認*/ if((vCRC & 0x8000) != 0) /*桁あふれ有り*/ { vCRC = vCRC << 1; /*CRC計算変数1Bitシフト*/ vCRC = vCRC ^ 0x1021; /*生成多項式のXOR*/ } else /*桁あふれ無し*/ { vCRC = vCRC << 1; /*CRC計算変数1Bitシフト*/ } /*データ変数がシフトで桁あふれするか確認*/ if((vData & 0x80) != 0) /*桁あふれ有り*/ { vData = vData << 1; /*データ変数1Bitシフト*/ vCRC = vCRC ^ 0x0001; /*CRC計算変数に1XOR*/ } else /*桁あふれ無し*/ { vData = vData << 1; /*データ変数1Bitシフト*/ } } } *(Data + StopAdr + 2) = (unsigned char)(vCRC & 0x00ff); /*CRCの下位書き込み*/ *(Data + StopAdr + 1) = (unsigned char)((vCRC >> 8) & 0x00ff); /*CRCの上位書き込み*/ return(vCRC); } 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); } unsigned short crc_itu_t(unsigned char *data, unsigned long num) { boost::crc_basic<16> calc(0x1021); calc.process_bytes(data, num); return static_cast<unsigned short>(calc.checksum()); } int main() { unsigned char data[6 + 2] = { 'a', 'b', 'c', 'd', 'e', 'f' }; std::cout << std::showbase << std::hex; std::cout << crc_itu_t(data, 6) << '\n'; std::cout << Crc(data, 6) << '\n'; std::cout << ProgCrc1(data, 0, 5) << '\n'; std::cout << static_cast<int>(data[6]) << '\n'; std::cout << static_cast<int>(data[7]) << '\n'; } ==== ./a.exe 0x3afd 0x58e1 0x3afd 0x3a 0xfd

Ru-LaLa
質問者

お礼

親切にありがとうございます。 やっぱり間違っているんですね。 教えて頂いたURLをパクリつつ、もう少し頑張ってみます。

その他の回答 (6)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.7

★昔買ったアルゴリズム事典より抜粋します。 サンプル: #include <limits.h> unsigned short crc( unsigned const char *pData, unsigned long lNum ) {  unsigned int crc16 = 0xFFFFU;  unsigned long i;  int j;    for ( i = 0 ; i < lNum ; i++ ){   crc16 ^= (unsigned int)pData[i] << (16 - CHAR_BIT);   for ( j = 0 ; j < CHAR_BIT ; j++ ){    if ( crc16 & 0x8000 ){     crc16 = (crc16 << 1) ^ 0x1021;    }    else{     crc16 <<= 1;    }   }  }  return (unsigned short)(~crc16); } その他: ・回答者 No.2 さんのリンクのソースでfor文の条件式が『Loop1<=StopAdr+2』となる理由が  良く分からないな?何で『StopAdr+2』に『+2』にしているの?不思議だ。どいう理由かな。  そもそも CRC-ITU-T って聞いた事が無い。CRC-CCITT なら聞いた事があります。  XOR している定数が 0x1021 だから多項式は x^16+x^12+x^5+x^0 となり CRC-CCITT だよな。  ネット検索したら『CRC-ITU-T』でヒットしたのでページを見たら多項式は同じだった。  http://page.freett.com/seaside/vip/crc/DocCRC.htm→『CRCの正体と種類』  もしかして『CRC-ITU-T』と『CRC-CCITT』は同じなのかな?→読んだら今は『ITU-T』だって。同じだ。 ・アルゴリズム事典では『if ( vData & 0x80 ){ … }』の処理はないね。  この質問のソースを見たときに『あれ?何か?変?』と思った箇所だ。  もう良く分からないのでこれまで。ギブアップ! ・以上。

Ru-LaLa
質問者

お礼

ありがとうございます。参考にします。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.6

うーーん。。。Oh-Orange さんので試してみましたが、値がサンプルコードのものや boost のライブラリのものとは違いますね^^; どれが正しいのか読んでないのでわかりませんが、『あるものは使えばいい。壊れてないのに直すなよ(by ワインバーグ)』ってことで、サンプルコードをそのまま使うのがいいんじゃないでしょうか。。。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★最初に。 >for(i = 0; i <= num; i++){  ↑  for(i = 0; i < num; i++){  です。『<=』だと1バイト余分に計算しちゃいますよ。  『i』カウンタを使うよりはポインタを使ったら。 ・下に書き直したソースを貼り付けて置きます。 サンプル: unsigned short Crc( unsigned char *Data, unsigned long num ) {  unsigned short vCrc;  //CRCを計算する変数  unsigned char vData;  int i;    for ( vCrc = 0 ; num > 0 ; num-- ){   vData = *Data++;  //1byte読み込み      for ( i = 0 ; i < 8 ; i++ ){    vCrc <<= 1; //1bitシフト    vData <<= 1; //データ変数1bitシフト        //CRC計算変数がシフトで桁あふれする場合    if ( vCrc & 0x8000 ){     vCrc ^= 0x1021; //多項式とXOR    }    if ( vData & 0x80 ){     vCrc ^= 1; //CRC計算変数に1をXOR    }   }  }  return vCrc; } その他: ・次のリンクを元に CRC-CCITT を書き直すと左ローテートしないといけないみたいだよ。  http://www.wdic.org/w/WDIC/CRC→『CRC - 通信用語の基礎知識』 ・テーブルを用いた CRC16 のソースが Vector さんのところにあります。  下の『参考URL』もどうぞ。 ・以上。

参考URL:
http://www.vector.co.jp/soft/dos/hardware/se020402.html
Ru-LaLa
質問者

お礼

なるほど、まずはそこからおかしかったのですね。 ありがとうございます。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.4

ていうか、コードが似てるので、パクりそこねたんですかね^^ そのまま使えばいいんじゃないでしょうか。。。

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.3

ん?ProgCrc1(data, 0, 5) で呼び出さないといけないのかな?すみません、Ru-LaLa さんのプログラムをきちんと読んでいないので^^; でも、  std::cout << ProgCrc1(data, 0, 5) << '\n'; としても、値が 0xcd50 になって、他ので計算した値とは違いました^^;

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.1

直接の回答ではないですが、特別なものでなければ、自分で作るより boost とかの CRC を使ったほうがいいんじゃないかと思います^^ http://boost.cppll.jp/HEAD/libs/crc/crc.html

Ru-LaLa
質問者

お礼

早い回答ありがとうございます。 すみません、私はC言語初心者でして。 参考のURL先の内容を理解できません。 本当に、ごめんなさい。

関連するQ&A

  • CRC16コード作成プログラムについて

    お世話なります。 PCと対象機械との通信を行おうと思っております。 内容としてCRC16のコードを使って、日時設定をPC→対象機器へ行いたいです。 CRC16の生成プログラムをいろいろ調べてみたところ、 今、自分のスキルでなんとかわかりそうなCRC16のソースが次の通りでした。 (行列の計算ぐらいならC言語で作れる程度です。。。) unsigned short crc_cal(unsigned short lng, unsigned char *str) { unsigned short crc, i, j, t; crc = 0xffff; for (i = 0; i < lng ; i++) { crc ^= (unsigned short) str[i]; for (j = 1; j <= 8; j++) { if (crc & 1) { // carry bit on crc = crc >> 1; crc ^= 0xa001; } else { // carry bit off crc = crc >> 1; } } } return crc; } “0C0C0C0C0C0C”と入力したら、CRCコードが算出されるプログラムを作りたく、 入力部分を作成してみたのですが・・・ int main(void) { unsigned short i,j, t; unsigned char str[256]; unsigned char str0; unsigned short crc; int k=0; printf("Please input key (HEX)\n"); for(k=0; k < 256; k++) { scanf("%c",&str0); // 文字列標準入力 if( str0=='\n') // Enterが押されたときの実行 { str[k]='\0'; // 文末にNULL文字 break; // for文のループ終了 } else { str[k]=str0; // NULLでなければ入力された文字を代入 } } crc = crc_cal(k,str); printf("crc=%X\n", crc); return 0; } 文字列を分解して・・・やるんだろうなってまではなんとなくわかるのですが、 どのようにしたらよいでしょうか。。。 ご教授よろしくお願いします。

  • 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はゼロになりました ゼロになる場合とならない場合があるのでしょうか?

  • C言語のキャストについて

    お世話になります。 CRC-16の計算プログラムをC言語でつくりました。 例えば・・・1F 08 00 00 12 34 なら“1F0800001234”と入力すると【EEC2】と表示するプログラムです。 ただ・・・.Net SDKでコンパイルするとできたのですが、Visual C++2008でコンパイルするとエラーが出てしまいます。 (48) : error C2664: 'strlen' : 1 番目の引数を 'unsigned char [256]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 (52) : error C2664: 'strtol' : 1 番目の引数を 'unsigned char [3]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 型変換が必要ってことまではわかったのですが・・・必要なのはわかって行き詰まり状態です。。。 どのようしたらよいのでしょうか?ご教授をよろしくお願いします。 ソースは以下の通りです。 #include "stdafx.h" #include <stdio.h> #include <string.h> #include <stdlib.h> unsigned short crc_cal(unsigned short lng, unsigned char *str) { unsigned short crc, i, j, t; t= 0x0000; crc = 0xffff; for (i = 0; i < lng ; i++) { crc ^= (unsigned short) str[i]; t = (unsigned short) str[i]; for (j = 1; j <= 8; j++) { if (crc & 1) { // carry bit on crc = crc >> 1; crc ^= 0xa001; } else { // carry bit off crc = crc >> 1; } } } return crc; } int main(void) { unsigned char str[256],data[128],hexstr[3]; unsigned short crc,CRC,len; while(1) { printf("Please input key (HEX)\n"); scanf("%255s",str); hexstr[2]='\0'; for(len=0; len<(strlen(str)/2) ;len++) { hexstr[0]=str[len*2]; hexstr[1]=str[len*2+1]; data[len]=(unsigned char)strtol(hexstr, NULL, 16); } crc = crc_cal(len,data); CRC = (crc>>8) | (crc<<8); printf("\nCRC16 = %04X\n\n", CRC); } return 0; }

  • 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 と出ます。 一般的な算出方法では、上記の説明以外に何か別の処理、初期値などがあるのでしょうか? お分かりになる方是非教えてください。 よろしくお願いします。

  • C言語のコードについて

    C言語の問題なのですか、作成したのですが内容がわからないです。 コードをわかりやすく解説していただけると嬉しいです。 #include <stdio.h> void printBinary(unsigned char num) { int i ; /*①上位ビットから順に表示する*/ for(i = 7 ; i >= 0; i--) { /*②シフトとマスクを使用しています。*/ printf("%d", (num>>i) &0x01 ); } printf("\n"); } int main(void) { unsigned char num1 = 0xD2;/*11010010*/ unsigned char num2 = 0x5E;/*01011110*/ printf("0xD2 : "); printBinary(num1); printf("0x5E : "); printBinary(num2); return 0; }

  • 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の計算に詳しい人、ご回答をお願いします。

  • C言語の配列の扱い

    次のような配列bufと変数dataを宣言して bufの中身をdataにコピーしたいのですが、 buf[0]のみで、buf[1]の値が入りません。 具体的には、buf[0]には16進数で0x3f、 buf[1]には0x3aが入っていて、 dataの値を0x3a3fにしたいのです。 教えてください。 ***************************** unsigned char buf[2]; unsigned short data; data = (unsigned short)*buf; *****************************

  • RGB→YUV変換のプログラム

    RGB→YUV変換を行っているのですが、 うまくいきません。 以下であっているのでしょうか? //RGB > YUV変換 void RGBtoYUV(char *filename,int width,int height) { FILE *fpt,*fpt_output; unsigned char *Input,*head; unsigned char Y=0,U=0,V=0; int i,j,b_flag=1; int modification=0; modification=width%4; //ファイルのオープン fopen_s(&fpt,filename,"rb"); if(fpt==NULL) { char DebugStr[256]; wsprintf(DebugStr,"%sが存在しません",filename); MessageBox(NULL,DebugStr,"File Error",MB_OK); } else { fopen_s(&fpt_output,"YUV.bmp","wb"); //ヘッダ情報の書き込み head=(unsigned char*)malloc(54); fread(head,sizeof(unsigned char),54,fpt); fwrite(head,sizeof(unsigned char),54,fpt_output); free(head); Input=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //メモリに展開 for(i=0;i<height;i++) { fread(&Input[i*(3*width)],sizeof(unsigned char),3*width,fpt); fseek(fpt,modification,SEEK_CUR); } fclose(fpt);//Inputファイルのクローズ for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { Y=(unsigned char)(0.299*Input[i+j+2]+0.587*Input[i+j+1]+0.114*Input[i+j]); U=(unsigned char)(-0.169*Input[i+j+2]-0.3316*Input[i+j+1]+0.500*Input[i+j]); V=(unsigned char)(0.500*Input[i+j+2]-0.4186*Input[i+j+1]-0.0813*Input[i+j]); //Y if(Y<0) { Input[i+j]=0x00; } else if(Y>255) { Input[i+j]=0xff; } else { Input[i+j]=Y; } //U if(U<0) { Input[i+j+1]=0x00; } else if(U>255) { Input[i+j+1]=0xff; } else { Input[i+j+1]=U; } //V if(V<0) { Input[i+j+2]=0x00; } else if(V>255) { Input[i+j+2]=0xff; } else { Input[i+j+2]=V; } } }//i fseek(fpt_output,54,SEEK_SET); for(i=0;i<height;i++) { fwrite(&Input[3*width*i],sizeof(unsigned char),3*width,fpt_output); //修正値の代入 for(j=0;j<modification;j++) { fwrite("\x000",sizeof(unsigned char),1,fpt_output); } } fclose(fpt_output); free(Input); } } 又 YUV→RGBにすると元の画像に戻らずに困っています。 プログラムに対するご指摘お願いします。 このプログラムはWindowGUIで幅と高さとファイル名を入力して 走らせるプログラムです。24bpp BMPが対象です。

  • c言語の難しい問題について

    (c言語の問題) 下記のプログラムを完成させ、キーボードから文字列を読み込み、-1文字ずらすことによって暗号化を行うプログラムを作りなさい。ただし、ピリオド、空白などはそのままにするようにすること。 例)this is a pen. sghr hr @ qdm. #include<stdio.h> #define CHAR_NUM 256 void angou( I ) { II } int main(void) { unsigned char text[CHAR_NUM]; char moji; int i; puts("暗号化する文字を入力しなさい。"); while((moji=getchar()) !=EOF){ text[i]=moji; i++; } angou(text i); printf("%s",text); return(0); } I、IIに入る文を書きなさい。 私はIには「char x[],int y」 IIには 「if('A'<x[i]<'Z' && 'a'<x[i]<'z') int j; for(j=0;j<y;j++) x[j]=x[j]-1 else」 といれたのですが、出力がうまくでません。どうすればいいのですか?

  • 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の値となるようなパラメータの組み合わせが有るか無いか、 ということになると思うのですが・・・ よろしくお願いします。

専門家に質問してみよう