summaryrefslogtreecommitdiff
path: root/crc24q.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2008-06-30 22:20:03 +0000
committerEric S. Raymond <esr@thyrsus.com>2008-06-30 22:20:03 +0000
commitbdf2df39929e34e190ace88583222dbaef621c26 (patch)
tree49bce6c5ca881a3560dc4412af94a7f866f9e4dc /crc24q.c
parentbf807d59c3bfe5ef654a7c10d45156ecdf3f88ee (diff)
downloadgpsd-bdf2df39929e34e190ace88583222dbaef621c26.tar.gz
CRC24Q checksum works now.
Diffstat (limited to 'crc24q.c')
-rw-r--r--crc24q.c136
1 files changed, 75 insertions, 61 deletions
diff --git a/crc24q.c b/crc24q.c
index d7c3fbe1..45dd490f 100644
--- a/crc24q.c
+++ b/crc24q.c
@@ -23,64 +23,76 @@
#include "crc24q.h"
static const unsigned crc24q[256] = {
- 0x00000000, 0x00D6A776, 0x00F64557, 0x0020E221, 0x00B78115,
- 0x00612663, 0x0041C442, 0x00976334, 0x00340991, 0x00E2AEE7,
- 0x00C24CC6, 0x0014EBB0, 0x00838884, 0x00552FF2, 0x0075CDD3,
- 0x00A36AA5, 0x00681322, 0x00BEB454, 0x009E5675, 0x0048F103,
- 0x00DF9237, 0x00093541, 0x0029D760, 0x00FF7016, 0x005C1AB3,
- 0x008ABDC5, 0x00AA5FE4, 0x007CF892, 0x00EB9BA6, 0x003D3CD0,
- 0x001DDEF1, 0x00CB7987, 0x00D02644, 0x00068132, 0x00266313,
- 0x00F0C465, 0x0067A751, 0x00B10027, 0x0091E206, 0x00474570,
- 0x00E42FD5, 0x003288A3, 0x00126A82, 0x00C4CDF4, 0x0053AEC0,
- 0x008509B6, 0x00A5EB97, 0x00734CE1, 0x00B83566, 0x006E9210,
- 0x004E7031, 0x0098D747, 0x000FB473, 0x00D91305, 0x00F9F124,
- 0x002F5652, 0x008C3CF7, 0x005A9B81, 0x007A79A0, 0x00ACDED6,
- 0x003BBDE2, 0x00ED1A94, 0x00CDF8B5, 0x001B5FC3, 0x00FB4733,
- 0x002DE045, 0x000D0264, 0x00DBA512, 0x004CC626, 0x009A6150,
- 0x00BA8371, 0x006C2407, 0x00CF4EA2, 0x0019E9D4, 0x00390BF5,
- 0x00EFAC83, 0x0078CFB7, 0x00AE68C1, 0x008E8AE0, 0x00582D96,
- 0x00935411, 0x0045F367, 0x00651146, 0x00B3B630, 0x0024D504,
- 0x00F27272, 0x00D29053, 0x00043725, 0x00A75D80, 0x0071FAF6,
- 0x005118D7, 0x0087BFA1, 0x0010DC95, 0x00C67BE3, 0x00E699C2,
- 0x00303EB4, 0x002B6177, 0x00FDC601, 0x00DD2420, 0x000B8356,
- 0x009CE062, 0x004A4714, 0x006AA535, 0x00BC0243, 0x001F68E6,
- 0x00C9CF90, 0x00E92DB1, 0x003F8AC7, 0x00A8E9F3, 0x007E4E85,
- 0x005EACA4, 0x00880BD2, 0x00437255, 0x0095D523, 0x00B53702,
- 0x00639074, 0x00F4F340, 0x00225436, 0x0002B617, 0x00D41161,
- 0x00777BC4, 0x00A1DCB2, 0x00813E93, 0x005799E5, 0x00C0FAD1,
- 0x00165DA7, 0x0036BF86, 0x00E018F0, 0x00AD85DD, 0x007B22AB,
- 0x005BC08A, 0x008D67FC, 0x001A04C8, 0x00CCA3BE, 0x00EC419F,
- 0x003AE6E9, 0x00998C4C, 0x004F2B3A, 0x006FC91B, 0x00B96E6D,
- 0x002E0D59, 0x00F8AA2F, 0x00D8480E, 0x000EEF78, 0x00C596FF,
- 0x00133189, 0x0033D3A8, 0x00E574DE, 0x007217EA, 0x00A4B09C,
- 0x008452BD, 0x0052F5CB, 0x00F19F6E, 0x00273818, 0x0007DA39,
- 0x00D17D4F, 0x00461E7B, 0x0090B90D, 0x00B05B2C, 0x0066FC5A,
- 0x007DA399, 0x00AB04EF, 0x008BE6CE, 0x005D41B8, 0x00CA228C,
- 0x001C85FA, 0x003C67DB, 0x00EAC0AD, 0x0049AA08, 0x009F0D7E,
- 0x00BFEF5F, 0x00694829, 0x00FE2B1D, 0x00288C6B, 0x00086E4A,
- 0x00DEC93C, 0x0015B0BB, 0x00C317CD, 0x00E3F5EC, 0x0035529A,
- 0x00A231AE, 0x007496D8, 0x005474F9, 0x0082D38F, 0x0021B92A,
- 0x00F71E5C, 0x00D7FC7D, 0x00015B0B, 0x0096383F, 0x00409F49,
- 0x00607D68, 0x00B6DA1E, 0x0056C2EE, 0x00806598, 0x00A087B9,
- 0x007620CF, 0x00E143FB, 0x0037E48D, 0x001706AC, 0x00C1A1DA,
- 0x0062CB7F, 0x00B46C09, 0x00948E28, 0x0042295E, 0x00D54A6A,
- 0x0003ED1C, 0x00230F3D, 0x00F5A84B, 0x003ED1CC, 0x00E876BA,
- 0x00C8949B, 0x001E33ED, 0x008950D9, 0x005FF7AF, 0x007F158E,
- 0x00A9B2F8, 0x000AD85D, 0x00DC7F2B, 0x00FC9D0A, 0x002A3A7C,
- 0x00BD5948, 0x006BFE3E, 0x004B1C1F, 0x009DBB69, 0x0086E4AA,
- 0x005043DC, 0x0070A1FD, 0x00A6068B, 0x003165BF, 0x00E7C2C9,
- 0x00C720E8, 0x0011879E, 0x00B2ED3B, 0x00644A4D, 0x0044A86C,
- 0x00920F1A, 0x00056C2E, 0x00D3CB58, 0x00F32979, 0x00258E0F,
- 0x00EEF788, 0x003850FE, 0x0018B2DF, 0x00CE15A9, 0x0059769D,
- 0x008FD1EB, 0x00AF33CA, 0x007994BC, 0x00DAFE19, 0x000C596F,
- 0x002CBB4E, 0x00FA1C38, 0x006D7F0C, 0x00BBD87A, 0x009B3A5B,
- 0x004D9D2D
+ 0x00000000, 0x01864CFB, 0x028AD50D, 0x030C99F6,
+ 0x0493E6E1, 0x0515AA1A, 0x061933EC, 0x079F7F17,
+ 0x08A18139, 0x0927CDC2, 0x0A2B5434, 0x0BAD18CF,
+ 0x0C3267D8, 0x0DB42B23, 0x0EB8B2D5, 0x0F3EFE2E,
+ 0x10C54E89, 0x11430272, 0x124F9B84, 0x13C9D77F,
+ 0x1456A868, 0x15D0E493, 0x16DC7D65, 0x175A319E,
+ 0x1864CFB0, 0x19E2834B, 0x1AEE1ABD, 0x1B685646,
+ 0x1CF72951, 0x1D7165AA, 0x1E7DFC5C, 0x1FFBB0A7,
+ 0x200CD1E9, 0x218A9D12, 0x228604E4, 0x2300481F,
+ 0x249F3708, 0x25197BF3, 0x2615E205, 0x2793AEFE,
+ 0x28AD50D0, 0x292B1C2B, 0x2A2785DD, 0x2BA1C926,
+ 0x2C3EB631, 0x2DB8FACA, 0x2EB4633C, 0x2F322FC7,
+ 0x30C99F60, 0x314FD39B, 0x32434A6D, 0x33C50696,
+ 0x345A7981, 0x35DC357A, 0x36D0AC8C, 0x3756E077,
+ 0x38681E59, 0x39EE52A2, 0x3AE2CB54, 0x3B6487AF,
+ 0x3CFBF8B8, 0x3D7DB443, 0x3E712DB5, 0x3FF7614E,
+ 0x4019A3D2, 0x419FEF29, 0x429376DF, 0x43153A24,
+ 0x448A4533, 0x450C09C8, 0x4600903E, 0x4786DCC5,
+ 0x48B822EB, 0x493E6E10, 0x4A32F7E6, 0x4BB4BB1D,
+ 0x4C2BC40A, 0x4DAD88F1, 0x4EA11107, 0x4F275DFC,
+ 0x50DCED5B, 0x515AA1A0, 0x52563856, 0x53D074AD,
+ 0x544F0BBA, 0x55C94741, 0x56C5DEB7, 0x5743924C,
+ 0x587D6C62, 0x59FB2099, 0x5AF7B96F, 0x5B71F594,
+ 0x5CEE8A83, 0x5D68C678, 0x5E645F8E, 0x5FE21375,
+ 0x6015723B, 0x61933EC0, 0x629FA736, 0x6319EBCD,
+ 0x648694DA, 0x6500D821, 0x660C41D7, 0x678A0D2C,
+ 0x68B4F302, 0x6932BFF9, 0x6A3E260F, 0x6BB86AF4,
+ 0x6C2715E3, 0x6DA15918, 0x6EADC0EE, 0x6F2B8C15,
+ 0x70D03CB2, 0x71567049, 0x725AE9BF, 0x73DCA544,
+ 0x7443DA53, 0x75C596A8, 0x76C90F5E, 0x774F43A5,
+ 0x7871BD8B, 0x79F7F170, 0x7AFB6886, 0x7B7D247D,
+ 0x7CE25B6A, 0x7D641791, 0x7E688E67, 0x7FEEC29C,
+ 0x803347A4, 0x81B50B5F, 0x82B992A9, 0x833FDE52,
+ 0x84A0A145, 0x8526EDBE, 0x862A7448, 0x87AC38B3,
+ 0x8892C69D, 0x89148A66, 0x8A181390, 0x8B9E5F6B,
+ 0x8C01207C, 0x8D876C87, 0x8E8BF571, 0x8F0DB98A,
+ 0x90F6092D, 0x917045D6, 0x927CDC20, 0x93FA90DB,
+ 0x9465EFCC, 0x95E3A337, 0x96EF3AC1, 0x9769763A,
+ 0x98578814, 0x99D1C4EF, 0x9ADD5D19, 0x9B5B11E2,
+ 0x9CC46EF5, 0x9D42220E, 0x9E4EBBF8, 0x9FC8F703,
+ 0xA03F964D, 0xA1B9DAB6, 0xA2B54340, 0xA3330FBB,
+ 0xA4AC70AC, 0xA52A3C57, 0xA626A5A1, 0xA7A0E95A,
+ 0xA89E1774, 0xA9185B8F, 0xAA14C279, 0xAB928E82,
+ 0xAC0DF195, 0xAD8BBD6E, 0xAE872498, 0xAF016863,
+ 0xB0FAD8C4, 0xB17C943F, 0xB2700DC9, 0xB3F64132,
+ 0xB4693E25, 0xB5EF72DE, 0xB6E3EB28, 0xB765A7D3,
+ 0xB85B59FD, 0xB9DD1506, 0xBAD18CF0, 0xBB57C00B,
+ 0xBCC8BF1C, 0xBD4EF3E7, 0xBE426A11, 0xBFC426EA,
+ 0xC02AE476, 0xC1ACA88D, 0xC2A0317B, 0xC3267D80,
+ 0xC4B90297, 0xC53F4E6C, 0xC633D79A, 0xC7B59B61,
+ 0xC88B654F, 0xC90D29B4, 0xCA01B042, 0xCB87FCB9,
+ 0xCC1883AE, 0xCD9ECF55, 0xCE9256A3, 0xCF141A58,
+ 0xD0EFAAFF, 0xD169E604, 0xD2657FF2, 0xD3E33309,
+ 0xD47C4C1E, 0xD5FA00E5, 0xD6F69913, 0xD770D5E8,
+ 0xD84E2BC6, 0xD9C8673D, 0xDAC4FECB, 0xDB42B230,
+ 0xDCDDCD27, 0xDD5B81DC, 0xDE57182A, 0xDFD154D1,
+ 0xE026359F, 0xE1A07964, 0xE2ACE092, 0xE32AAC69,
+ 0xE4B5D37E, 0xE5339F85, 0xE63F0673, 0xE7B94A88,
+ 0xE887B4A6, 0xE901F85D, 0xEA0D61AB, 0xEB8B2D50,
+ 0xEC145247, 0xED921EBC, 0xEE9E874A, 0xEF18CBB1,
+ 0xF0E37B16, 0xF16537ED, 0xF269AE1B, 0xF3EFE2E0,
+ 0xF4709DF7, 0xF5F6D10C, 0xF6FA48FA, 0xF77C0401,
+ 0xF842FA2F, 0xF9C4B6D4, 0xFAC82F22, 0xFB4E63D9,
+ 0xFCD11CCE, 0xFD575035, 0xFE5BC9C3, 0xFFDD8538,
};
unsigned crc24q_hash(unsigned char *data, int len)
{
int i;
- unsigned crc = 0xffffff;
+ unsigned crc = 0;
for (i = 0; i < len; i++) {
crc = (crc << 8) ^ crc24q[data[i] ^ (unsigned char)(crc>>16)];
@@ -91,25 +103,27 @@ unsigned crc24q_hash(unsigned char *data, int len)
return crc;
}
-#define LO(x) ((x) & 0x0000ffff)
-#define MID(x) (((x) >> 8) & 0x0000ffff)
-#define HI(x) (((x) >> 16) & 0x0000ffff)
+#define LO(x) ((x) & 0xff)
+#define MID(x) (((x) >> 8) & 0xff)
+#define HI(x) (((x) >> 16) & 0xff)
void crc24q_sign(unsigned char *data, int len)
{
unsigned crc = crc24q_hash(data, len);
- data[len] = LO(crc);
+ data[len] = HI(crc);
data[len+1] = MID(crc);
- data[len+2] = HI(crc);
+ data[len+2] = LO(crc);
+
+ return crc;
}
bool crc24q_check(unsigned char *data, int len)
{
- unsigned crc = crc24q_hash(data, len);
+ unsigned crc = crc24q_hash(data, len-3);
- return (((data[len-3] == LO(crc)) &&
+ return (((data[len-3] == HI(crc)) &&
(data[len-2] == MID(crc)) &&
- (data[len-1] == HI(crc))));
+ (data[len-1] == LO(crc))));
}