-(unsigned short)crc16
{
Byte *bytes = (Byte *)[self bytes];
uint16_t length = (uint16_t)[self length];
return (unsigned short)CTtDlgANSI_CRC_16(bytes, length);
// return (unsigned short)CCheckSumCCITT_CRC_16(bytes, length);
}
//CCITT V.41,x16 + x12 + x5 + 1
unsigned short CCheckSumCCITT_CRC_16(Byte* btData,int nLength)
{
if((btData==NULL)||(nLength<=0))
{
NSLog(@"无效数组!");
return -1;
}
unsigned short CRC=0;
Byte j;
int i;
for(i=0;i<nLength;i++)
{
CRC^=(btData[i]<<8);
for (j=0;j<8;j++)
{
if(CRC&0x8000)CRC=((CRC<<1)^0x1021);
else CRC<<=1;
}
}
return ((CRC>>8)+(CRC<<8));/* 应用时低在先 */
}
unsigned short CTtDlgANSI_CRC_16(Byte * btData,int nLength) //ANSI CRC-16,x16 + x15 + x2 + 1
{
if((btData==NULL)||(nLength<=0))
{
NSLog(@"无效数组!");
return -1;
}
unsigned short CRC=0xFFFF;
Byte j,Tmp=0;
int i;
for(i=0;i<nLength;i++)
{
CRC^=btData[i];
for (j=0;j<8;j++)
{
Tmp=CRC&0x0001;
CRC=CRC>>1;
if(Tmp)CRC=(CRC^0xA001);
}
}
return ((CRC>>8)+(CRC<<8)); /* 应用时高在先 */
}