1.下面是C++的代码
uint16_t UpdateCRC16(uint16_t crcIn, uint8_t byte)
{
uint32_t crc = crcIn;
uint32_t in = byte|0x100;
do
{
crc <<= 1;
in <<= 1;
if (in&0x100)
++crc;
if (crc&0x10000)
crc ^= 0x1021;
}
while (!(in&0x10000));
return crc&0xffffu;
}
uint16_t Cal_CRC16(const uint8_t* data, uint32_t size)
{
uint32_t crc = 0;
const uint8_t* dataEnd = data+size;
while (data<dataEnd)
crc = UpdateCRC16(crc,*data++);
crc = UpdateCRC16(crc,0);
crc = UpdateCRC16(crc,0);
return crc&0xffffu;
}
2.下面是我自己实现的Java版本,有些问题,跪求上面CRC16的Java版本
public int UpdateCRC16(int crcIn, byte data)
{
int crc = crcIn;
int in = data|0x100;
do
{
crc <<= 1;
in <<= 1;
if ( (in&0x100) == 0x100)
++crc;
if ( (crc&0x10000) == 0x10000)
crc ^= 0x1021;
}
while ((in&0x10000) != 0x10000);
return crc&0xffff;
}
public int Cal_CRC16(byte[] data, int size)
{
int crc = 0;
int i;
for( i = 0; i<size;i++)
{
crc = UpdateCRC16(crc, data[i]);
}
crc = UpdateCRC16(crc,(byte)0);
crc = UpdateCRC16(crc,(byte)0);
return crc&0xffff;
}