4

サード パーティのシステムと連携しようとしていますが、テキスト データの送信時に CRC 値を計算するためのコード サンプルが提供されています。

ベンダーが提供する C コードは次のようになります。

#define CRCRES 0xf0b8  /* residue for good verify */ 
#define DEBUG 

unsigned crctbl[] = {0x0000, 0x1081, 0x2102, 0x3183, 
                     0x4204, 0x5285, 0x6306, 0x7387, 
                     0x8408, 0x9489, 0xa50a, 0xb58b, 
                     0xc60c, 0xd68d, 0xe70e, 0xf78f}; 

/* 
 * This uses a 32 byte table to lookup the crc 4 bits at a time. 
 * The CRC CCITT is used. 
 */ 


unsigned short calc_crc(unsigned char *ptr, unsigned length) 

{ 
  unsigned short crc; 
  unsigned short i; 
  unsigned char pos,ch; 

  crc = 0xffff;  /* precondition crc */ 
  for (i = 0; i < length; i++,ptr++) { 
    ch = *ptr; 
    pos = (crc ^ ch) & 15; 
    crc = ((crc >> 4) & 0x0fff) ^ crctbl[pos]; 
    ch >>= 4; 
    pos = (crc^ch) & 15; 
    crc = ((crc >> 4) & 0xffff) ^ crctbl[pos]; 
  } 
  crc = ~crc;  /* post condition */ 
  crc = (crc << 8) | (crc >> 8); /* bytewise reverse */ 
  return crc; 
} 


/* 
 * tests the block of code containing the crc to verify it's 
 * content.  This compares to the reversed and inverted 
 * residue. 
 */ 

int test_crc(unsigned char *ptr, unsigned length) 

{ 
  unsigned short crc; 
  unsigned char arr [] = {'X','Y','Z'}; 

  crc = calc_crc(arr,3); 
  printf("Calced crc of test to be %04x, (should be 470f)\n", crc); 
  return (crc == 0x470f); 
} 

このコードをコピーして、サンプルの C プログラムを入れました。test_crc メソッドは、CRC を 470f と計算していません (DD7A として計算しています)。

ベンダーが言っているようにこのコードが機能しないことを誰かが検証するか、test_crc が正しい値を返すように手伝ってくれることを願っています。

助けてくれてありがとう。

4

3 に答える 3

4

問題が解決しました。ベンダーからの仕様が正しくありませんでした。XYZの正しいチェックサムはDD7Aです。ドキュメントが正しくありませんでした。

前のページで、実際のメッセージのcrcを取得するためにcalc_crcメソッドに渡すデータも正しくないことを説明しているという事実に加えて、それはトリッキーなプロジェクトになりました。

助けてくれてありがとう。

于 2009-02-23T23:11:36.347 に答える
3

計算は、私の頭に浮かぶエラーを示していません。アルゴリズムをもう一度見直してください。特に、考えられる問題を探す場合、アルゴリズムのさまざまな部分で AND 演算される定数は と であることに注意して0x0fffください0xffff0x0fff多分それはもっと対称的であるべき0xfff0です...時々、本当の問題は別の場所から来るかもしれないと思い、明らかなことを再確認するのを忘れます... :)

于 2009-02-23T15:09:20.627 に答える
2

ハードウェア プラットフォームは同じですか? エンディアンが異なる可能性がありますか?(たとえば、68000 CPUのx86があります。)

于 2009-02-23T14:30:51.217 に答える