c# - 需要 CRC 编程帮助,从 .NET 类到 C 的 CRC32 转换

标签 c# .net c crc crc32

代码(用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

任何解释都会有帮助

最佳答案

或者直接用谷歌搜索...第二个结果是:http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/libkern/crc32.c

从 C# 向后移植它是困难的方法,这些算法中的大部分已经在 C 中了。

关于c# - 需要 CRC 编程帮助,从 .NET 类到 C 的 CRC32 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11724864/

相关文章:

.net - Mono 在哪里存储 xml 文档?

c# - 以编程方式创建 Excel 2007 工作表

c# - 启用 WCF 服务以与 JSON 一起使用

c - 如何从单独的库文件中包含 syscalls.c?

c - 在 Windows、Mac 和 Linux 上使用的 C 库应该放在哪里

c - 我想打破存储在数组中 '\n' 字符处的字符串?

c# - new String() 不在 C# 中创建新的引用对象?

c# - 如何在特定字符后获取子字符串

c# - 从 Active Directory 获取用户组时出错,在单声道中使用 LDAP

javascript - Ajax 调用工作很慢。可以让它更快吗?