Quantcast
Channel: Jobs
Viewing all articles
Browse latest Browse all 18427

Problems with Checksum Calculation

$
0
0
I’ve been trying to replicate a 1-wire 8-bit CRC checksum in Qt, but I’ve been having a lot of trouble. You can see an example of what I’m trying to do in Python code here: https://forum.sparkfun.com/viewtopic.php?p=51145. It uses the maxim specified polynomial of x^8 + x^5 + x^4 + 1 to compute the CRC checksum. I have a feeling it is related to differences with Qt’s QString versus the Python variables, maybe an endian issue? I’ve tried about 100 different combinations, but I’m really struggling to get the correct answer from any of my implementations. My latest attempt it attached for reference: quint8 calculateCRC(QByteArray payload) {     // CRC table from http://forum.sparkfun.com/viewtopic.php?p=51145     const quint8 crcTable[] = {         0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,         157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,         35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,         190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,         70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,         219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,         101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,         248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,         140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,         17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,         175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,         50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,         202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,         87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,         233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,         116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53     };       // convert format     QList data;     for (int i = 0; i < payload.size(); i++)     {         data.append((quint8)payload[i]);     }       // calculate checksum     quint8 val = 0, tmp;     for (int i = 0; i < data.size(); i++)     {         tmp = val ^ data[i];         val = crcTable[tmp];     }     return val; } Using this code, I am still getting incorrect results. I have also tried switching the endian encoding (i.e. qFromBigEndian) as well as reversing the data based on some other hints I was able to find. I’m still hitting a dead end though since I can’t get the correct result for a simple test case. You can check the results using this online calculator: http://www.datastat.com/sysadminjournal/maximcrc.cgi For example, entering 00 28 00 (for 0×00 0×28 0×00) should result in 0xB7. Does anyone have any ideas what I might be doing wrong?

Viewing all articles
Browse latest Browse all 18427

Trending Articles