From 8bcb6a51b5bb8c71b30b61759d94e14691cddbfa Mon Sep 17 00:00:00 2001 From: Zilog80 Date: Wed, 20 Jan 2016 16:42:43 +0100 Subject: [PATCH] ecc: error correction/crc --- ecc/crc_polymod.c | 186 ++++++++++++++++++++ ecc/ecc.txt | 436 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 622 insertions(+) create mode 100644 ecc/crc_polymod.c create mode 100644 ecc/ecc.txt diff --git a/ecc/crc_polymod.c b/ecc/crc_polymod.c new file mode 100644 index 0000000..e631e03 --- /dev/null +++ b/ecc/crc_polymod.c @@ -0,0 +1,186 @@ + + +#include +#include +#include + + +// CRC16 +// Generatorpolynom x^16+x^12+x^5+1 = (1) 0001 0000 0010 0001 = 0x(1)1021 +#define CRC 16 +#define CODELEN_CRC (2*0xDF) +unsigned char msg[CODELEN_CRC], + par[8]; +char bitstr[CODELEN_CRC*8+1+32*8]; +char g16[] = "10001000000100001"; // big endian +unsigned int crc16poly = 0x1021; +unsigned int crc16init = 0xFFFF; // 16bit + + +// BCH-Code (63,51) +// Generatorpolynom x^12+x^10+x^8+x^5+x^4+x^3+1 +#define BCH 46 +#define CODELEN_BCH 46 +char g12[] = "1010100111001"; // big endian + + +char *g = NULL; +int msglen, parlen; + +int option = 0; + + +int check(char *str) { + while (*str) { + //printf("%02X ", *str); + if (*str < 0x30 || *str > 0x31) return -1; + str++; + } + //printf("\n"); + return 0; +} + +int deg(char *x) { + int i; + i = strlen(x); + while (*x && *x == '0') { + x++; + i--; + } + return i-1; +} + +char *shortstr(char *x) { + if (strlen(x) <= 1) return x; + while (strlen(x) > 1 && *x == '0') x++; + return x; +} + +int polymodcheck(char *x) { + int i, j, d; + char *t = malloc(strlen(x)+1); + char *taddr = t; + t[0] = '\0'; + for (i = 0; i < strlen(x)+1; i++) t[i] = x[i]; + t = shortstr(t); + d = strlen(t); + printf("%s\n", t); + printf("%s\n", g); + while (deg(t) >= deg(g)) { + for (i = 0; i < strlen(g); i++) { + if (t[i] == g[i]) t[i] = '0'; else t[i] = '1'; + } + t = shortstr(t); + for (j = 0; j < d-strlen(t); j++) printf(" "); + printf("%s\n", t); + if (t[0] == '0') return 0; + for (j = 0; j < d-strlen(t); j++) printf(" "); + printf("%s\n", g); + } + printf("%s\n", t); + free(taddr); + return 1; +} + +unsigned int crc16(unsigned char bytes[], int len) { + unsigned int rem = crc16init; // init value + int i, j; + for (i = 0; i < len; i++) { + rem = rem ^ (bytes[i] << 8); + for (j = 0; j < 8; j++) { + if (rem & 0x8000) { + rem = (rem << 1) ^ crc16poly; + } + else { + rem = (rem << 1); + } + rem &= 0xFFFF; + } + } + return rem; +} + + +int main(int argc, char *argv[]) { + char *str; + int i, j, rem, byt; + + if (argv[1]) { + if (strcmp(argv[1], "--crc") == 0) option = CRC; + if (strcmp(argv[1], "--bch") == 0) option = BCH; + } + if (!argv[1] || !option) { + fprintf(stderr, "%s --crc [crc]\n", argv[0]); + fprintf(stderr, "%s --bch \n", argv[0]); + return 0; + } + + str = argv[2]; + + if (option == CRC) { + + msglen = strlen(str)/2; + if (msglen > 2*CODELEN_CRC) { + fprintf(stderr, "len > %d\n", CODELEN_CRC); + return -3; + } + + for (i = 0; i < msglen; i++) sscanf(argv[2]+2*i, "%2hhx", msg+i); + rem = crc16(msg, msglen); + printf("%04X\n", rem); + + g = g16; + parlen = (strlen(g)-1)/8; + + for (i = 0; i < msglen; i++) { + byt = msg[i]; + if (i < 2) byt ^= (crc16init >> (8*(1-i))) & 0xFF; // init value 0xFFFF + for (j = 0; j < 8; j++) { + bitstr[8*i+7-j] = (byt & 0x1) + 0x30; + byt >>= 1; + } + } + // wenn crc nicht angehaengt, dann x^n shiften: + for (i = 0; i < 8*parlen; i++) bitstr[8*msglen+i] = 0x30; + if (argv[3] && strlen(argv[3])/2 == parlen) { + for (i = 0; i < parlen; i++) { + sscanf(argv[3]+2*i, "%2hhx", par+i); + byt = par[i]; + for (j = 0; j < 8; j++) { + bitstr[8*(msglen+parlen-1-i)+7-j] = (byt & 0x1) + 0x30; + byt >>= 1; + } + } + } +/* + for (i = 0; i < msglen; i++) printf("%02X ", msg[i]); + printf(" "); for (i = 0; i < parlen; i++) printf("%02X ", par[i]); + printf("\n"); +*/ + str = shortstr(bitstr); + } + else if (option == BCH) { + + if (strlen(str) > CODELEN_BCH) { + printf("CODELEN\n"); + return -3; + } + + str = shortstr(str); + if (check(str)) { + printf("nicht in GF(2)[X]\n"); + return -1; + } + //printf("f = %s\n", str); + //printf("deg(f) = %d\n", deg(str)); + g = g12; + + } + + //if (option != CRC) + polymodcheck(str); + + + return 0; +} + diff --git a/ecc/ecc.txt b/ecc/ecc.txt new file mode 100644 index 0000000..2c545cd --- /dev/null +++ b/ecc/ecc.txt @@ -0,0 +1,436 @@ + +Meisei +====== +BCH(63,51)-Code mit Generatorpolynom +x^12+x^10+x^8+x^5+x^4+x^3+1. +gekuerzt auf (46,34), die letzten 12 bit sind die BCH-Kontrollbits. + +Das Generatorpolynom kann man finden, wenn man geeignete Codewoerter addiert (linearer Code), +um das kleinste Codewort ungleich 0 zu finden, z.B.: + +0000000000000000 1 0000000000000000 1 000010111011 ++ +0000000000000000 1 0000000000000010 0 010001011111 += +0000000000000000 0 0000000000000010 1 010011100100 +-> +101010011100100 = (x^12+x^10+x^8+x^5+x^4+x^3+1)x^2 + +Die 34 Nachrichtenbit sind aufgeteilt in 16+1+16+1, d.h. nach einem 16 bit Block kommt ein Paritaetsbit, +dass 1 ist, wenn die Anzahl 1en in den 16 bit davor gerade ist und sonst 0. + +Um nur zu pruefen, kann man Polynomdivision durchfuehren (CRC): +1) +0000000000000000 1 0000000000000000 1 000010111011 : 0000 0000 0BB +-> 0000000000000000100000000000000001000010111011 + +./crc_polymod --bch 0000000000000000100000000000000001000010111011 +100000000000000001000010111011 +1010100111001 + 1010011100100001000010111011 + 1010100111001 + 111011101001000010111011 + 1010100111001 + 10001110101100010111011 + 1010100111001 + 100111011110010111011 + 1010100111001 + 1101000010110111011 + 1010100111001 + 111100101111111011 + 1010100111001 + 10110110011011011 + 1010100111001 + 11111101001011 + 1010100111001 + 1010100111001 + 1010100111001 + 0 + +2) +0000000000000000 1 1010111100100010 1 000110000001 : 0000 AF22 181 +-> 0000000000000000110101111001000101000110000001 + +./crc_polymod --bch 0000000000000000110101111001000101000110000001 +110101111001000101000110000001 +1010100111001 + 11111100101100101000110000001 + 1010100111001 + 1010101011110101000110000001 + 1010100111001 + 1100111101000110000001 + 1010100111001 + 110011010001110000001 + 1010100111001 + 11001001101010000001 + 1010100111001 + 1100000011000000001 + 1010100111001 + 110100100001000001 + 1010100111001 + 11110111101100001 + 1010100111001 + 1011110011110001 + 1010100111001 + 1010100111001 + 1010100111001 + 0 + + + + +Vaisala +======= +http://www.vaisala.com/Vaisala%20Documents/Vaisala%20News%20Articles/VN164/VN164_State-of-the-Art_Radiosonde_Telemetry.pdf + +CRC16: (poly=0x(1)1021, init=0xFFFF) +Reed-Solomon: +RS(255,231) +GF(2^8)=GF(2)[x]/(f): f=x^8+x^4+x^3+x^2+1 = 0x11D +Generator von GF(2^8)*: alpha=0x02 (primitive Einheitswurzel) +Generatorpolynom fuer RS-Code: +(X-alpha^0)...(X-alpha^23) = +X^24 + 0x7A X^23 + 0x76 X^22 + 0xA9 X^21 + 0x46 X^20 + 0xB2 X^19 + 0xED X^18 + 0xD8 X^17 + 0x66 X^16 + 0x73 X^15 + 0x96 X^14 + 0xe5 X^13 + 0x49 X^12 + + 0x82 X^11 + 0x48 X^10 + 0x3D X^9 + 0x2B X^8 + 0xCE X^7 + 0x01 X^6 + 0xED X^5 + 0xF7 X^4 + 0x7F X^3 + 0xD9 X^2 + 0x90 X + 0x75 + + +RS92: +HEADER 6 +DATA 210 +RS-PARITY 24 + +./ecc-rs_vaisala 2a2a2a2a2a106510e81820204b34393533393334006100083d3d07b342bb3e9809d3bc3f754c963bebfb690cca2b0fd9670f00670f8c0f11a458111e8810da410d30430ddc84673db01c852167ab07298b3cb05a536e0fffcf4faf7f4f3fff8fcfffffffff7fe5918aef20e8110175879900d0e0e900061f8c048aa393009edea1fe2557dc0019549f04b5160d00ae998b00e12a4200370b8608cacc1900b3e08905bd60040126da9303e1d4b4006d04a00573469700d6a98b00699f120195828f046ed7680503030000000000000000b27dff0202000200f0be2a40a7cd69b9ed0668ec12182e8560ea6dd0733612a1 +RS92 +codeword +errors: 0 +0000000000000000000000000000000000000000000002000202FF7DB2000000000000000003030568D76E048F829501129F69008BA9D60097467305A0046D00B4D4E10393DA26010460BD0589E0B30019CCCA08860B3700422AE1008B99AE000D16B5049F541900DC5725FEA1DE9E0093A38A048C1F0600E9E0D0009987750111E820EF8A91E57FFFFFFFFFCF8FFF3F4F7FAF4FCFFF0F6E535AB03C8B2907AB6721851CB03D6784DC0D43300D41DA10881E1158A4110F8C0F67000F67D90F2BCA0C69FBEB3B964C753FBCD309983EBB42B3073D3D08006100343339333539344B202018E81065A1123673D06DEA60852E1812EC6806EDB969CDA7402ABEF0 +frame: +2a2a2a2a2a106510e81820204b34393533393334006100083d3d07b342bb3e9809d3bc3f754c963bebfb690cca2b0fd9670f00670f8c0f11a458111e8810da410d30430ddc84673db01c852167ab07298b3cb05a536e0fffcf4faf7f4f3fff8fcfffffffff7fe5918aef20e8110175879900d0e0e900061f8c048aa393009edea1fe2557dc0019549f04b5160d00ae998b00e12a4200370b8608cacc1900b3e08905bd60040126da9303e1d4b4006d04a00573469700d6a98b00699f120195828f046ed7680503030000000000000000b27dff0202000200f0be2a40a7cd69b9ed0668ec12182e8560ea6dd0733612a1 + + +RS41: +HEADER 8 +RS-PARITY 48 = 2*24 +DATA 264-462 (max 2*231=462) + +"interleaved" +Die 2 Codewoerter setzen sich zusammen aus den DATA-Bytes an den geraden bzw. ungeraden Positionen und ersten bzw. zweiten RS-PARITY-Teil. + + RS(231,255) RS(231,255) L=40 CRC L=42 CRC L=30 CRC L=89 CRC L=21 CRC L=17 CRC +8635f44093df1a60 2c87e0fa0521e8943d9cef4c7a67393f6d39fb546461f2111b6447ab79a746c80350cda5344157f8c0c12234f4690222 0f 7928 16174b313933303239331a00000300000a00002f0007322ce53e31991abf12dada3eb68468c16755 d51c 7a2a 15310216060245f302000d08a31607821e08bb210219060243f302000000000000000000000000000000 220d 7c1e 0807d03cdc071fd81ddb19d70a8d0eb602b60cb518d40692ff00ff00ff00 1c27 7d59 b8d83301ff0f881f0f38f4fe18b283038735ff000000003eb8ff4947201e6e3aff55415f13fc6e005440440cf100009e9f7406f85800832b631719d70010bebc172a8b00000000000000000000000000000000000000000000 a48b 7b15 366181193ef05d07e1245b1be0f721f801f6080410 7b0b 7611 0000000000000000000000000000000000 ecc7 +1) +8635f44093df1a60 (HDR) +2c87e0fa0521e8943d9cef4c7a67393f6d39fb546461f2111b6447ab79a746c80350cda5344157f8c0c12234f4690222 (2xRS) +0f +7928 (L=0x28=40) +16174b313933303239331a00000300000a00002f0007322ce53e31991abf12dada3eb68468c16755 d51c (CRC-OK) +7a2a (L=0x2a=42) +15310216060245f302000d08a31607821e08bb210219060243f302000000000000000000000000000000 220d (CRC-OK) +7c1e (L=0x1e=30) +0807d03cdc071fd81ddb19d70a8d0eb602b60cb518d40692ff00ff00ff00 1c27 (CRC-OK) +7d59 (L=0x59=89) +b8d83301ff0f881f0f38f4fe18b283038735ff000000003eb8ff4947201e6e3aff55415f13fc6e005440440cf100009e9f7406f85800832b631719d70010bebc172a8b00000000000000000000000000000000000000000000 a48b (CRC-OK) +7b15 (L=0x15=21) +366181193ef05d07e1245b1be0f721f801f6080410 7b0b (CRC-OK) +7611 (L=0x11=17) +0000000000000000000000000000000000 ecc7 (CRC-OK) + +./ecc-rs_vaisala 8635f44093df1a602c87e0fa0521e8943d9cef4c7a67393f6d39fb546461f2111b6447ab79a746c80350cda5344157f8c0c12234f46902220f792816174b313933303239331a00000300000a00002f0007322ce53e31991abf12dada3eb68468c16755d51c7a2a15310216060245f302000d08a31607821e08bb210219060243f302000000000000000000000000000000220d7c1e0807d03cdc071fd81ddb19d70a8d0eb602b60cb518d40692ff00ff00ff001c277d59b8d83301ff0f881f0f38f4fe18b283038735ff000000003eb8ff4947201e6e3aff55415f13fc6e005440440cf100009e9f7406f85800832b631719d70010bebc172a8b00000000000000000000000000000000000000000000a48b7b15366181193ef05d07e1245b1be0f721f801f60804107b0b76110000000000000000000000000000000000ecc7 +RS41 +codeword1 +errors: 0 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EC0000000000000000110B10080121E05BE15D3E81367BA400000000000000000000002ABC10D7172B00F8749E000C4000FC5F553A1E47FF3E00003503B2FE381F0F01D8592700000092D4B5B6B68DD7DBD8073C071E0D0000000000000000F30219210882160800F30216312A1C55C1843EDABF993E2C072F000003003332333117280F11F2616454FB396D3F39677A4CEF9C3D94E82105FAE0872C +codeword2 +errors: 0 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C7000000000000000000767B04F6F8F71B2407F01961158B00000000000000000000008B17BE0019638358069F00F144546E1341FF6E2049B80000FF878318F40F88FF33B87D1CFFFFFF06180C020E0A191D1FDCD0087C220000000000000002430602BB1E07A30D02450602157AD56768B6DA121A31E53200000A00001A3930394B1679220269F43422C1C0F8574134A5CD5003C846A779AB47641B +frame: +8635f44093df1a602c87e0fa0521e8943d9cef4c7a67393f6d39fb546461f2111b6447ab79a746c80350cda5344157f8c0c12234f46902220f792816174b313933303239331a00000300000a00002f0007322ce53e31991abf12dada3eb68468c16755d51c7a2a15310216060245f302000d08a31607821e08bb210219060243f302000000000000000000000000000000220d7c1e0807d03cdc071fd81ddb19d70a8d0eb602b60cb518d40692ff00ff00ff001c277d59b8d83301ff0f881f0f38f4fe18b283038735ff000000003eb8ff4947201e6e3aff55415f13fc6e005440440cf100009e9f7406f85800832b631719d70010bebc172a8b00000000000000000000000000000000000000000000a48b7b15366181193ef05d07e1245b1be0f721f801f60804107b0b76110000000000000000000000000000000000ecc7 + +2) +./ecc-rs_vaisala 8635f44093df1a60421080e56396389c102cf6db9276308a11f9f8792cb620beae0662688bba0eb2c0bdfa3bd10f0368c07ad0ac33c77046f0792888134b343032303234341c00000100000d00007a000732013230323434254e00002c011205b43ca475537a2a95050229fd015be502d931084d2a075b3308ed060228fd015de50200000000000000000000000000000061d67c1e4d07a0ba92170e9003fa01f813b40c921ed811fa0bf504d20af920fa17f765137d59950b3501ffc43086200a1101420000000521008f527605b1b600faa7e10e3b1301acce8e1c78c5ff0de3c41479b6ff48781a09dcfdffa2f1c30d51190151e0e4113d1701e27da60504a4ffdb2511085bd1003f05bd0c8346ffda787b156d2f421735a22f00f88b0b1ea7fe220b23030902112a417ea5d0343030333030303120313036313320202033312e362030363733203033353220303730302031323235312033383030203133343036203535333920313430353820353239332037383030203830323120373334203931392039353533383738203937323839373820343238383338353332362032393032313631203539313039203335303539203637303020333738352034363838203636393920363839392038303030c8e4762e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf08 +RS41 +codeword1 +errors: 1 +pos: 136 +BF000000000000000000000000000000000000000000000076C830383938203936383620383330372035352030392036323920323533383438393239383835393939343731302030373332203534203335363431303820353220303032332037303631202031302030303034A54111092322A70BF82F35426D7BDA460C05005B11DBA4057D013DE450190DF1FFDC1A48B614E3FF788EAC130EA700B1768F210000010A86C4010B5913F7FAF9D2F5FAD892B4F8FA9017BA071ED60000000000000000E5012806085B2A08D9E50129052A53A4B4122C0025343001077A00000100343232341328F0BE20B62C79F8F9118A307692DBF62C109C389663E5801042 +codeword2 +errors: 2 +pos: 106 176 +0800000000000000000000000000000000000000000000002EE43030203936393620383435372030363930333931353131303236333838322037383720373335203120332032383038203935383031393520303320303331323130372035303336202E332033363131303130D07E2A02030BFE1E8B00A2172F1578FF83BD3FD10825FF04A6E21711E00151C3A2FD0978FF79C40DC51CCE013BE1FAB6055200050042112030FF35957D6517200A040B111F0C1301030E92A04D7C6100000000000000025DFD02ED33074D31025BFD02957A753C0501004E3432323200000D00001C3430304B88794670C733ACD07AC068030FD13BFABDC0B20EBA8B686206AE +frame: +8635f44093df1a60421080e56396389c102cf6db9276308a11f9f8792cb620beae0662688bba0eb2c0bdfa3bd10f0368c07ad0ac33c77046f0792888134b343032303234341c00000100000d00007a000732013230323434254e00002c011205b43ca475537a2a95050229fd015be502d931084d2a075b3308ed060228fd015de50200000000000000000000000000000061d67c1e4d07a0ba92170e9003fa01f813b40c921fd811fa0bf504d20af920fa17f765137d59950b3501ffc43086200a1101420000000521008f527605b1b600faa7e10e3b1301acce8e1c78c5ff0de3c41479b6ff48781a09dcfdffa2f1c30d51190150e0e4113d1701e27da60504a4ffdb2511085bd1003f05bd0c8346ffda787b156d2f421735a22f00f88b0b1ea7fe220b23030902112a417ea5d0343030313030303120313036313320202033312e362030363733203033353220303730302031323235312033383030203133343036203535333920313430353820353239332037383030203830323120373334203931392039353533383738203937323839373820343238383338353332362032393032313631203539313039203335303539203637303020333738352034363838203636393920363839392038303030c8e4762e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf08 + + +CRC16: +./crc_polymod --crc 0000000000000000000000000000000000 ecc7 +C7EC +11111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 +10001000000100001 + 1110111111011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 110011111001111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 10001111000111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 111000011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11010011110000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1011011110100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11111110110011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1110110110111101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 110010110101101100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 10000110100101110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1110100001111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 110000001101000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 10010001100000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11001100100111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1000100100011001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 100001001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11001101000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1000101000110001000000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1000100001100000000000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1110000100000000000000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 110100100010000100000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 10110100011000110000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 111100011100111000000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11110011101111010000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1111011101011011000000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 111111101001011100000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11101101000011110000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1100101000111111000000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 100001000101111100000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11000100111110000000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1001100111010001000000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1000111000001100000000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11000011100100000000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1001011100000001000000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1111100010001100000000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 111000010011100100000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11010010010100110000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1011010010000111000000000000000000000000000000000000001100011111101100 + 10001000000100001 + 11110010010111100000000000000000000000000000000000001100011111101100 + 10001000000100001 + 1111010010011101000000000000000000000000000000000001100011111101100 + 10001000000100001 + 111110010001101100000000000000000000000000000000001100011111101100 + 10001000000100001 + 11100010000101110000000000000000000000000000000001100011111101100 + 10001000000100001 + 1101010000001111000000000000000000000000000000001100011111101100 + 10001000000100001 + 101110000011111100000000000000000000000000000001100011111101100 + 10001000000100001 + 1100000010111110000000000000000000000000000001100011111101100 + 10001000000100001 + 100100010101110100000000000000000000000000001100011111101100 + 10001000000100001 + 110010100110110000000000000000000000000001100011111101100 + 10001000000100001 + 10000100111110010000000000000000000000001100011111101100 + 10001000000100001 + 1100111010011000000000000000000000001100011111101100 + 10001000000100001 + 100011010001000100000000000000000001100011111101100 + 10001000000100001 + 1010000000110000000000000000001100011111101100 + 10001000000100001 + 10100000100000100000000000001100011111101100 + 10001000000100001 + 101000100100101000000000001100011111101100 + 10001000000100001 + 1010100101101010000000001100011111101100 + 10001000000100001 + 10000101111010100000001100011111101100 + 10001000000100001 + 1101111110101000001100011111101100 + 10001000000100001 + 101011110111000101100011111101100 + 10001000000100001 + 1001110110000111100011111101100 + 10001000000100001 + 1010110010111000011111101100 + 10001000000100001 + 10010010101000111111101100 + 10001000000100001 + 11010101100110111101100 + 10001000000100001 + 1011101100010110101100 + 10001000000100001 + 11001100000110001100 + 10001000000100001 + 1000100000010000100 + 10001000000100001 + 0 + +./crc_polymod --crc 0000000000000000000000000000000000 +C7EC +11111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +10001000000100001 + 1110111111011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 110011111001111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 10001111000111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 111000011111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11010011110000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1011011110100011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11111110110011100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1110110110111101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 110010110101101100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 10000110100101110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1110100001111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 110000001101000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 10010001100000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11001100100111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1000100100011001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 100001001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11001101000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1000101000110001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1000100001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1110000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 110100100010000100000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 10110100011000110000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 111100011100111000000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11110011101111010000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1111011101011011000000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 111111101001011100000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11101101000011110000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1100101000111111000000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 100001000101111100000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11000100111110000000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1001100111010001000000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1000111000001100000000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11000011100100000000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1001011100000001000000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1111100010001100000000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 111000010011100100000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11010010010100110000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1011010010000111000000000000000000000000000000000000000000000000000000 + 10001000000100001 + 11110010010111100000000000000000000000000000000000000000000000000000 + 10001000000100001 + 1111010010011101000000000000000000000000000000000000000000000000000 + 10001000000100001 + 111110010001101100000000000000000000000000000000000000000000000000 + 10001000000100001 + 11100010000101110000000000000000000000000000000000000000000000000 + 10001000000100001 + 1101010000001111000000000000000000000000000000000000000000000000 + 10001000000100001 + 101110000011111100000000000000000000000000000000000000000000000 + 10001000000100001 + 1100000010111110000000000000000000000000000000000000000000000 + 10001000000100001 + 100100010101110100000000000000000000000000000000000000000000 + 10001000000100001 + 110010100110110000000000000000000000000000000000000000000 + 10001000000100001 + 10000100111110010000000000000000000000000000000000000000 + 10001000000100001 + 1100111010011000000000000000000000000000000000000000 + 10001000000100001 + 100011010001000100000000000000000000000000000000000 + 10001000000100001 + 1010000000110000000000000000000000000000000000 + 10001000000100001 + 10100000100000100000000000000000000000000000 + 10001000000100001 + 101000100100101000000000000000000000000000 + 10001000000100001 + 1010100101101010000000000000000000000000 + 10001000000100001 + 10000101111010100000000000000000000000 + 10001000000100001 + 1101111110101000000000000000000000 + 10001000000100001 + 101011110111000100000000000000000 + 10001000000100001 + 1001110110000110000000000000000 + 10001000000100001 + 1010110010110100000000000000 + 10001000000100001 + 10010010100100100000000000 + 10001000000100001 + 11010100000101000000000 + 10001000000100001 + 1011100000001001000000 + 10001000000100001 + 11000000011001100000 + 10001000000100001 + 1001000011101101000 + 10001000000100001 + 1100011111101100 + 10001000000100001 +1100011111101100 +Rest: +1100011111101100 = 0xC7EC +