代碼(C語言編寫):CRC編程需要幫助,CRC32轉換從.NET類到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的相同多項式進行檢查,如果該除數的其餘數據爲零,則您知道數據是正確的。
我不明白這兩個函數的實現。根據我所瞭解的,函數chksum_crc32gentab()會生成校驗和可以用32位CRC多項式進行檢測的所有可能的十六進制值。我沒有得到的一件事是如何poly = 0xEDB88320L;等價於一個多項式。我不明白這個函數底部的邏輯。例如,如果條件爲if(crc & 1),這是否意味着對於crc中的每一位是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
任何解釋將有助於