我是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。 谢谢 迪帕克
答案 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
,错字short
,或者对整数大小有任何其他类型的限制。你必须添加它。这就是crc &= 0xffff
正在做的事情。没有它,位移动了#34; out&#34;短暂的回来困扰着你并给出一个无意义的结果。此外,我将0x0000
替换为0
,因为它看起来像是试图让Ruby将整数视为&#34; short&#34;,这是不可能的。