コード (C で記述):
unsigned long chksum_crc32 (unsigned char *block, unsigned int length)
{
register unsigned long crc;
unsigned long i;
crc = 0xFFFFFFFF;
for (i = 0; i < length; i++)
{
crc = ((crc >> 8) & 0x00FFFFFF) ^ crc_tab[(crc ^ *block++) & 0xFF];
}
return (crc ^ 0xFFFFFFFF);
}
/* chksum_crc32gentab() -- to a global crc_tab[256], this one will
* calculate the crcTable for crc32-checksums.
* it is generated to the polynom [..]
*/
void chksum_crc32gentab ()
{
unsigned long crc, poly;
int i, j;
poly = 0xEDB88320L;
for (i = 0; i < 256; i++)
{
crc = i;
for (j = 8; j > 0; j--)
{
if (crc & 1)
{
crc = (crc >> 1) ^ poly;
}
else
{
crc >>= 1;
}
}
crc_tab[i] = crc;
}
}
手始めに; 私はCRCがどのように機能するかを知っています。最初に除数が指定された多項式で計算され、次にこのFCS(フレームチェックシーケンス)がデータセットに追加され、エンドユーザーシステムに送信されます。転送が完了すると、FCS の計算に使用されたのと同じ多項式で FCS がチェックされ、その除数によるデータの剰余がゼロの場合、データが正しいことがわかります。
これら 2 つの関数の実装がわかりません。私が学んだことから、関数 chksum_crc32gentab() は、チェックサムが 32 ビット CRC 多項式で取ることができるすべての可能な 16 進数値を生成します。私が得られないことの1つは、poly = 0xEDB88320L; の方法です。は多項式と同等です。この関数の一番下のロジックもわかりません。たとえば、条件付きのif (crc & 1)は、crc のすべてのビットが 1 の場合は計算し、それ以外の場合は 1 ビット右にシフトすることを意味しますか?
chksum_crc32(unsigned char *block, unsigned int length); もわかりません。. この関数はバイト文字列を取り込んで、テーブルで計算された適切な crc 値に変換するだけですか?. forループ内で使用するロジックについて混乱していると思います。
誰かがこのコードを理解しているなら、説明は素晴らしいでしょう。これは、.net クラスからの crc32 変換で機能します。データが変換され、これらの関数で使用される方法の例は次のようになります: (C# ソース)
MemoryStream ms = new MemoryStream(System.Text.Encoding.Default.GetBytes(input));
foreach (byte b in crc32.ComputeHash(ms))
hash += b.ToString("x2").ToLower();
C コードが取得された元のサイトとプロジェクトは次のとおりです。http://www.codeproject.com/Articles/35134/How-to-calculate-CRC-in-C
どんな説明でも役に立ちます