使用截断多项式800516将CRC16从C转换为Ruby

时间:2013-08-20 11:13:39

标签: c ruby crc16

我是Ruby的新手,请帮助。

这是我需要转换为Ruby的C代码。

传递值[1,2,3,4,5]它在HEX中给出了B059

    unsigned short CalcCrc16(const unsigned char *Data,unsigned short DataLen)
    {
      unsigned short Temp;
      unsigned short Crc;
      Crc = 0;
      while (DataLen--)
      {
             Temp = (unsigned short)((*Data++) ^ (Crc >> 8));
             Temp ^= (Temp >> 4);
             Temp ^= (Temp >> 2);
             Temp ^= (Temp >> 1);
             Crc = (Crc << 8) ^ (Temp << 15) ^ (Temp << 2) ^ Temp;
      }
        return Crc; 
   }

这是我尝试过的Ruby代码:

class CRC16 
  def CRC16.CalculateCrc16(data) 
    crc = 0x0000 
    temp = 0x0000 
    i = 0 
    while i < data.Length 
      value = data[i] 
      temp = (value ^ (crc >> 8)) 
      temp = (temp ^ (temp >> 4)) 
      temp = (temp ^ (temp >> 2)) 
      temp = (temp ^ (temp >> 1)) 
      crc = (((crc << 8) ^ (temp << 15) ^ (temp << 2) ^ temp)) 
      i += 1 
    end 
    return crc 
  end 
end

请帮我把这段代码转换成Ruby。 谢谢 迪帕克

1 个答案:

答案 0 :(得分:4)

你快到了。

以下是修复:

class CRC16 
  def CRC16.CalculateCrc16(data) 
    crc = 0
    temp = 0
    i = 0 
    while i < data.length    # Modified from OP version
      value = data[i] 
      temp = (value ^ (crc >> 8)) 
      temp = (temp ^ (temp >> 4)) 
      temp = (temp ^ (temp >> 2)) 
      temp = (temp ^ (temp >> 1)) 
      crc = (((crc << 8) ^ (temp << 15) ^ (temp << 2) ^ temp))
      crc &= 0xffff          # New - keep integer in "unsigned short" bit space
      i += 1 
    end 
    return crc 
  end 
end

我改变了两件事,使其按照C版本工作:

  • Length - &gt; length,错字
  • Ruby没有short,或者对整数大小有任何其他类型的限制。你必须添加它。这就是crc &= 0xffff正在做的事情。没有它,位移动了#34; out&#34;短暂的回来困扰着你并给出一个无意义的结果。

此外,我将0x0000替换为0,因为它看起来像是试图让Ruby将整数视为&#34; short&#34;,这是不可能的。