crcgen: utility program to generate CRC tables
authorH. Peter Anvin <hpa@zytor.com>
Thu, 16 Jul 2009 14:20:14 +0000 (10:20 -0400)
committerH. Peter Anvin <hpa@zytor.com>
Thu, 16 Jul 2009 14:20:14 +0000 (10:20 -0400)
Small utility program to generate CRC tables in both C and Perl
formats.  Note: we don't actually need a true CRC, which is what this
generates.  We may want to consider going to a "generalized CRC",
meaning a randomly generated set of 8 bytewise permutations.  These
have the advantage of not being linear, while having the same software
implementation as a true CRC.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
misc/crcgen.c [new file with mode: 0644]

diff --git a/misc/crcgen.c b/misc/crcgen.c
new file mode 100644 (file)
index 0000000..df8b0c3
--- /dev/null
@@ -0,0 +1,47 @@
+#include <inttypes.h>
+#include <stdio.h>
+
+int main(int argc, char *argv[])
+{
+    /* Polynomial in bit-reversed notation */
+    uint64_t poly;
+    uint64_t crctab[256], v;
+    int i, j;
+
+    poly = strtoumax(argv[1], NULL, 0);
+
+    printf("/* C */\n");
+    printf("static const uint64_t crc64_tab[256] = {\n");
+    for (i = 0; i < 256; i++) {
+       v = i;
+       for (j = 0; j < 8; j++)
+           v = (v >> 1) ^ ((v & 1) ? poly : 0);
+       crctab[i] = v;
+    }
+
+    for (i = 0; i < 256; i += 2) {
+       printf("    /* %02x */ UINT64_C(0x%016"PRIx64"), "
+              "UINT64_C(0x%016"PRIx64")%s\n",
+              i, crctab[i], crctab[i+1], (i == 254) ? "" : ",");
+    }
+    printf("};\n\n");
+
+    printf("# perl\n");
+    printf("@crc64_tab = (\n");
+    for (i = 0; i < 256; i += 2) {
+       printf("    [0x%08"PRIx32", 0x%08"PRIx32"], "
+              "[0x%08"PRIx32", 0x%08"PRIx32"]%-1s    # %02x\n",
+              (uint32_t)(crctab[i] >> 32),
+              (uint32_t)(crctab[i]),
+              (uint32_t)(crctab[i+1] >> 32),
+              (uint32_t)(crctab[i+1]),
+              (i == 254) ? "" : ",",
+              i);
+    }
+    printf(");\n");
+
+    return 0;
+}
+
+
+