0

我当前的问题是我在软件中计算 CRC32 哈希,然后在固件中检查它,但是当我在固件中计算哈希时,它应该是它的两倍。

软件(用 C# 编写):

        public string SCRC(string input)
        {
            //Calculate CRC-32
            Crc32 crc32 = new Crc32();
            string hash = "";

            byte[] convert = Encoding.ASCII.GetBytes(input);

            MemoryStream ms = new MemoryStream(System.Text.Encoding.Default.GetBytes(input));

            foreach (byte b in crc32.ComputeHash(ms))
                hash += b.ToString("x2").ToLower();

            return hash;


        }

使用的固件功能(用 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;
   }
}

调用上述函数的固件代码(用C编写):

//CommandPtr should now be pointing to the rest of the command      
        chksum_crc32gentab();
        HardCRC = chksum_crc32( (unsigned)CommandPtr, strlen(CommandPtr));
        printf("Hardware CRC val is %lu\n", HardCRC);

请注意,CommandPTR 是对软件方法中名为“字符串输入”的相同数据的引用。

有谁知道为什么我可以获得大约两倍于我在软件中使用的价值?Aka HardCRC 是其应有的两倍,我猜它与我的 unsigned char 转换有关。

4

0 回答 0