AceCRC  1.1.1
Cyclic Redundancy Check (CRC) algorithms (e.g. crc16ccitt, crc32) programmatically converted from C99 code generated by pycrc (https://pycrc.org) to Arduino C++ using namespaces and PROGMEM flash memory.
crc32_nibble.cpp
Go to the documentation of this file.
1 
20 #if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_SAMD)
21  #include <avr/pgmspace.h>
22 #else
23  #include <pgmspace.h>
24 #endif
25 #include "crc32_nibble.hpp" // header file converted by AceCRC
26 #include <stdlib.h>
27 #include <stdint.h>
28 
29 namespace ace_crc {
30 namespace crc32_nibble {
31 
32 
33 
37 static const crc_t crc_table[16] PROGMEM = {
38  0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
39  0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
40 };
41 
42 
43 crc_t crc_reflect(crc_t data, size_t data_len)
44 {
45  unsigned int i;
46  crc_t ret;
47 
48  ret = data & 0x01;
49  for (i = 1; i < data_len; i++) {
50  data >>= 1;
51  ret = (ret << 1) | (data & 0x01);
52  }
53  return ret;
54 }
55 
56 
57 crc_t crc_update(crc_t crc, const void *data, size_t data_len)
58 {
59  const unsigned char *d = (const unsigned char *)data;
60  uint8_t tbl_idx;
61 
62  while (data_len--) {
63  tbl_idx = crc ^ *d;
64  crc = (pgm_read_dword(crc_table + (tbl_idx & 0x0f))) ^ (crc >> 4);
65  tbl_idx = crc ^ (*d >> 4);
66  crc = (pgm_read_dword(crc_table + (tbl_idx & 0x0f))) ^ (crc >> 4);
67  d++;
68  }
69  return crc & 0xffffffff;
70 }
71 
72 } // crc32_nibble
73 } // ace_crc
uint16_t crc_t
The type of the CRC values.
Functions and types for CRC checks.
uint32_t crc_t
The type of the CRC values.