Skip to content

Instantly share code, notes, and snippets.

@jinleileiking
Created May 17, 2012 08:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jinleileiking/2717346 to your computer and use it in GitHub Desktop.
Save jinleileiking/2717346 to your computer and use it in GitHub Desktop.
Testing f**king CRC
typedef unsigned short WORD16;
typedef unsigned long WORD32;
typedef unsigned char BYTE;
#define NULL 0
#define SWAP16(A) (((A)>>8) | (((A)&0x00ff) <<8))
/* CRC16表 */
const WORD16 crctab16[] ={
// X16+X12+X5+1 余式表
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};
WORD16 awCRCBuf[1024] = {0};
WORD16 COMM_Cal_CRC16(WORD16 *pwData, WORD16 StartBitPos, WORD16 BitLen)
{
WORD16 BitTest;
WORD16 crc = 0xffff; /* Preset */
WORD16 wByteLen = 0;
WORD16 da;
WORD32 dwTmp = 0;
WORD16 *pwCRCBuf = NULL;
pwCRCBuf = &awCRCBuf[0];
/* 端转换 */
for (dwTmp = 0;dwTmp< (BitLen >> 2); dwTmp++)
{
pwCRCBuf[dwTmp] = SWAP16(pwData[dwTmp]);
}
if (StartBitPos == 0)
{
wByteLen = BitLen/16; /* 8bit byte number */
}
if (wByteLen != 0)
{
BitLen = BitLen%16; /* */
}
/* 计算整8bit部分,使用查表法 */
while(wByteLen > 0)
{
/* high 8 bit in current 16 bit word */
da = (WORD16)(crc >> 8); // 以8 位二进制数暂存CRC 的高8 位
crc <<= 8; // 左移8 位
crc ^= crctab16[da ^ (((*pwCRCBuf) >> 8) & 0xff)]; // 高字节和当前数据XOR 再查表
/* low 8 bit in current 16 bit word */
da = (WORD16)(crc >> 8); // 以8 位二进制数暂存CRC 的高8 位
crc <<= 8; // 左移8 位
crc ^= crctab16[da ^ (((*pwCRCBuf) ) & 0xff)]; // 高字节和当前数据XOR 再查表
/* */
wByteLen--;
/* next word16 */
pwCRCBuf++;
} /* while(wByteLen > 0) */
BitTest = 0x8000 >> StartBitPos;
/* 对指定的bit数目进行计算 */
while(BitLen-- != 0)
{
if((crc & 0x8000) != 0)
{
/* 余式CRC 乘以2 再求CRC */
crc *= 2;
crc ^= 0x1021;
}
else
{
crc *= 2;
}
if(((*pwCRCBuf) & BitTest) != 0)
{
crc ^= 0x1021; /* 再加上本位的CRC */
}
/* 调整数据指针 */
if (BitTest == 0x0001)
{
pwCRCBuf++;
BitTest = 0x8000;
}
else
{
BitTest >>= 1;
}
} /* while(BitLen-- != 0) */
return(crc);
}
BYTE reverse(BYTE ucInput)
{
return (ucInput >> 7) | ((ucInput >> 5) & 0x02) | ((ucInput >> 3) & 0x04) | ((ucInput >> 1) & 0x08) |
((ucInput << 1) & 0x10) | ((ucInput << 3) & 0x20) | ((ucInput << 5) & 0x40) | ((ucInput<<7) & 0x80);
}
int main (void)
{
WORD16 wCRC;
WORD32 dwPos = 0;
BYTE aucBufOgn[] ={0xff ,0xff, 0xff, 0xff, 0x50, 0x03 , 0x91 ,0xc0, 0x00, 0x00, 0x00, 0x57, 0x47, 0x9d, 0xff, 0x86, 0x00 ,0x01 ,0x41 ,0xa7 , 0x29 ,0x40 ,0x1a ,0x00 ,0x24, 0x00 };
// BYTE aucBufOgn[] ={0xff ,0xff, 0xff, 0xff, 0x50, 0x03 , 0x91 ,0xc0, 0x00, 0x00, 0x00, 0xf5, 0x47, 0x9d, 0xff, 0x86, 0x00 ,0x01 ,0x41 ,0xa7 , 0x29 ,0x40 ,0x1a ,0x00 ,0x24, 0x00};
#if 1
for (dwPos =0; dwPos < sizeof(aucBufOgn); dwPos++)
{
printf("aucBufOgn[%u] = 0x%02X\r\n", dwPos, aucBufOgn[dwPos]);
}
wCRC = COMM_Cal_CRC16((WORD16 *)(&aucBufOgn[0]), 0, sizeof(aucBufOgn) * 8);
printf("wCRC = 0x%04X\r\n", wCRC);
printf("~wCRC = 0x%04X\r\n", (WORD16)(~wCRC));
printf("wCRC reverse = 0x%04X \r\n", (reverse((wCRC) >> 8) << 8 | reverse(wCRC)));
printf("~wCRC reverse = 0x%04X \r\n", (reverse((~wCRC) >> 8) << 8 | reverse(~wCRC)));
printf("~(wCRC reverse) = 0x%04X \r\n", ~(reverse((wCRC) >> 8) << 8 | reverse(wCRC)));
printf("~(~wCRC reverse) = 0x%04X \r\n", ~(reverse((~wCRC) >> 8) << 8 | reverse(~wCRC)));
#endif
#if 0
for (dwPos =0; dwPos < sizeof(aucBufOgn); dwPos++)
{
aucBufOgn[dwPos] = (aucBufOgn[dwPos] >> 7) | ((aucBufOgn[dwPos] >> 5) & 0x02) | ((aucBufOgn[dwPos] >> 3) & 0x04) | ((aucBufOgn[dwPos] >> 1) & 0x08) |
((aucBufOgn[dwPos] << 1) & 0x10) | ((aucBufOgn[dwPos] << 3) & 0x20) | ((aucBufOgn[dwPos] << 5) & 0x40) | ((aucBufOgn[dwPos]<<7) & 0x80);
}
for (dwPos =0; dwPos < sizeof(aucBufOgn); dwPos++)
{
printf("aucBufOgn[%u] = 0x%02X\r\n", dwPos, aucBufOgn[dwPos]);
}
wCRC = COMM_Cal_CRC16((WORD16 *)(&aucBufOgn[0]), 0, sizeof(aucBufOgn) * 8);
printf("wCRC = 0x%04X\r\n", wCRC);
printf("~wCRC = 0x%04X\r\n", (WORD16)(~wCRC));
printf("wCRC reverse = 0x%02X%02X \r\n", reverse((wCRC) >> 8), reverse(wCRC));
printf("~wCRC reverse = 0x%02X%02X \r\n", reverse((~wCRC) >> 8), reverse(~wCRC));
#endif
printf("We want: E6 71 ------ 1110 0110 0111 0001\r\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment