2#ifndef LIBCLOD_CRC_TABLES_H
3#define LIBCLOD_CRC_TABLES_H
7#define CRC64_POLYNOMIAL UINT64_C(0x42F0E1EBA9EA3693)
8#define CRC64_NORMALISED_POLYNOMIAL UINT64_C(0x42F0E1EBA9EA3693)
9#define CRC64_REFLECTED false
10static constexpr uint64_t crc64_table[256] = {
11 UINT64_C(0x0), UINT64_C(0x42F0E1EBA9EA3693), UINT64_C(0x85E1C3D753D46D26), UINT64_C(0xC711223CFA3E5BB5),
12 UINT64_C(0x493366450E42ECDF), UINT64_C(0xBC387AEA7A8DA4C), UINT64_C(0xCCD2A5925D9681F9), UINT64_C(0x8E224479F47CB76A),
13 UINT64_C(0x9266CC8A1C85D9BE), UINT64_C(0xD0962D61B56FEF2D), UINT64_C(0x17870F5D4F51B498), UINT64_C(0x5577EEB6E6BB820B),
14 UINT64_C(0xDB55AACF12C73561), UINT64_C(0x99A54B24BB2D03F2), UINT64_C(0x5EB4691841135847), UINT64_C(0x1C4488F3E8F96ED4),
15 UINT64_C(0x663D78FF90E185EF), UINT64_C(0x24CD9914390BB37C), UINT64_C(0xE3DCBB28C335E8C9), UINT64_C(0xA12C5AC36ADFDE5A),
16 UINT64_C(0x2F0E1EBA9EA36930), UINT64_C(0x6DFEFF5137495FA3), UINT64_C(0xAAEFDD6DCD770416), UINT64_C(0xE81F3C86649D3285),
17 UINT64_C(0xF45BB4758C645C51), UINT64_C(0xB6AB559E258E6AC2), UINT64_C(0x71BA77A2DFB03177), UINT64_C(0x334A9649765A07E4),
18 UINT64_C(0xBD68D2308226B08E), UINT64_C(0xFF9833DB2BCC861D), UINT64_C(0x388911E7D1F2DDA8), UINT64_C(0x7A79F00C7818EB3B),
19 UINT64_C(0xCC7AF1FF21C30BDE), UINT64_C(0x8E8A101488293D4D), UINT64_C(0x499B3228721766F8), UINT64_C(0xB6BD3C3DBFD506B),
20 UINT64_C(0x854997BA2F81E701), UINT64_C(0xC7B97651866BD192), UINT64_C(0xA8546D7C558A27), UINT64_C(0x4258B586D5BFBCB4),
21 UINT64_C(0x5E1C3D753D46D260), UINT64_C(0x1CECDC9E94ACE4F3), UINT64_C(0xDBFDFEA26E92BF46), UINT64_C(0x990D1F49C77889D5),
22 UINT64_C(0x172F5B3033043EBF), UINT64_C(0x55DFBADB9AEE082C), UINT64_C(0x92CE98E760D05399), UINT64_C(0xD03E790CC93A650A),
23 UINT64_C(0xAA478900B1228E31), UINT64_C(0xE8B768EB18C8B8A2), UINT64_C(0x2FA64AD7E2F6E317), UINT64_C(0x6D56AB3C4B1CD584),
24 UINT64_C(0xE374EF45BF6062EE), UINT64_C(0xA1840EAE168A547D), UINT64_C(0x66952C92ECB40FC8), UINT64_C(0x2465CD79455E395B),
25 UINT64_C(0x3821458AADA7578F), UINT64_C(0x7AD1A461044D611C), UINT64_C(0xBDC0865DFE733AA9), UINT64_C(0xFF3067B657990C3A),
26 UINT64_C(0x711223CFA3E5BB50), UINT64_C(0x33E2C2240A0F8DC3), UINT64_C(0xF4F3E018F031D676), UINT64_C(0xB60301F359DBE0E5),
27 UINT64_C(0xDA050215EA6C212F), UINT64_C(0x98F5E3FE438617BC), UINT64_C(0x5FE4C1C2B9B84C09), UINT64_C(0x1D14202910527A9A),
28 UINT64_C(0x93366450E42ECDF0), UINT64_C(0xD1C685BB4DC4FB63), UINT64_C(0x16D7A787B7FAA0D6), UINT64_C(0x5427466C1E109645),
29 UINT64_C(0x4863CE9FF6E9F891), UINT64_C(0xA932F745F03CE02), UINT64_C(0xCD820D48A53D95B7), UINT64_C(0x8F72ECA30CD7A324),
30 UINT64_C(0x150A8DAF8AB144E), UINT64_C(0x43A04931514122DD), UINT64_C(0x84B16B0DAB7F7968), UINT64_C(0xC6418AE602954FFB),
31 UINT64_C(0xBC387AEA7A8DA4C0), UINT64_C(0xFEC89B01D3679253), UINT64_C(0x39D9B93D2959C9E6), UINT64_C(0x7B2958D680B3FF75),
32 UINT64_C(0xF50B1CAF74CF481F), UINT64_C(0xB7FBFD44DD257E8C), UINT64_C(0x70EADF78271B2539), UINT64_C(0x321A3E938EF113AA),
33 UINT64_C(0x2E5EB66066087D7E), UINT64_C(0x6CAE578BCFE24BED), UINT64_C(0xABBF75B735DC1058), UINT64_C(0xE94F945C9C3626CB),
34 UINT64_C(0x676DD025684A91A1), UINT64_C(0x259D31CEC1A0A732), UINT64_C(0xE28C13F23B9EFC87), UINT64_C(0xA07CF2199274CA14),
35 UINT64_C(0x167FF3EACBAF2AF1), UINT64_C(0x548F120162451C62), UINT64_C(0x939E303D987B47D7), UINT64_C(0xD16ED1D631917144),
36 UINT64_C(0x5F4C95AFC5EDC62E), UINT64_C(0x1DBC74446C07F0BD), UINT64_C(0xDAAD56789639AB08), UINT64_C(0x985DB7933FD39D9B),
37 UINT64_C(0x84193F60D72AF34F), UINT64_C(0xC6E9DE8B7EC0C5DC), UINT64_C(0x1F8FCB784FE9E69), UINT64_C(0x43081D5C2D14A8FA),
38 UINT64_C(0xCD2A5925D9681F90), UINT64_C(0x8FDAB8CE70822903), UINT64_C(0x48CB9AF28ABC72B6), UINT64_C(0xA3B7B1923564425),
39 UINT64_C(0x70428B155B4EAF1E), UINT64_C(0x32B26AFEF2A4998D), UINT64_C(0xF5A348C2089AC238), UINT64_C(0xB753A929A170F4AB),
40 UINT64_C(0x3971ED50550C43C1), UINT64_C(0x7B810CBBFCE67552), UINT64_C(0xBC902E8706D82EE7), UINT64_C(0xFE60CF6CAF321874),
41 UINT64_C(0xE224479F47CB76A0), UINT64_C(0xA0D4A674EE214033), UINT64_C(0x67C58448141F1B86), UINT64_C(0x253565A3BDF52D15),
42 UINT64_C(0xAB1721DA49899A7F), UINT64_C(0xE9E7C031E063ACEC), UINT64_C(0x2EF6E20D1A5DF759), UINT64_C(0x6C0603E6B3B7C1CA),
43 UINT64_C(0xF6FAE5C07D3274CD), UINT64_C(0xB40A042BD4D8425E), UINT64_C(0x731B26172EE619EB), UINT64_C(0x31EBC7FC870C2F78),
44 UINT64_C(0xBFC9838573709812), UINT64_C(0xFD39626EDA9AAE81), UINT64_C(0x3A28405220A4F534), UINT64_C(0x78D8A1B9894EC3A7),
45 UINT64_C(0x649C294A61B7AD73), UINT64_C(0x266CC8A1C85D9BE0), UINT64_C(0xE17DEA9D3263C055), UINT64_C(0xA38D0B769B89F6C6),
46 UINT64_C(0x2DAF4F0F6FF541AC), UINT64_C(0x6F5FAEE4C61F773F), UINT64_C(0xA84E8CD83C212C8A), UINT64_C(0xEABE6D3395CB1A19),
47 UINT64_C(0x90C79D3FEDD3F122), UINT64_C(0xD2377CD44439C7B1), UINT64_C(0x15265EE8BE079C04), UINT64_C(0x57D6BF0317EDAA97),
48 UINT64_C(0xD9F4FB7AE3911DFD), UINT64_C(0x9B041A914A7B2B6E), UINT64_C(0x5C1538ADB04570DB), UINT64_C(0x1EE5D94619AF4648),
49 UINT64_C(0x2A151B5F156289C), UINT64_C(0x4051B05E58BC1E0F), UINT64_C(0x87409262A28245BA), UINT64_C(0xC5B073890B687329),
50 UINT64_C(0x4B9237F0FF14C443), UINT64_C(0x962D61B56FEF2D0), UINT64_C(0xCE73F427ACC0A965), UINT64_C(0x8C8315CC052A9FF6),
51 UINT64_C(0x3A80143F5CF17F13), UINT64_C(0x7870F5D4F51B4980), UINT64_C(0xBF61D7E80F251235), UINT64_C(0xFD913603A6CF24A6),
52 UINT64_C(0x73B3727A52B393CC), UINT64_C(0x31439391FB59A55F), UINT64_C(0xF652B1AD0167FEEA), UINT64_C(0xB4A25046A88DC879),
53 UINT64_C(0xA8E6D8B54074A6AD), UINT64_C(0xEA16395EE99E903E), UINT64_C(0x2D071B6213A0CB8B), UINT64_C(0x6FF7FA89BA4AFD18),
54 UINT64_C(0xE1D5BEF04E364A72), UINT64_C(0xA3255F1BE7DC7CE1), UINT64_C(0x64347D271DE22754), UINT64_C(0x26C49CCCB40811C7),
55 UINT64_C(0x5CBD6CC0CC10FAFC), UINT64_C(0x1E4D8D2B65FACC6F), UINT64_C(0xD95CAF179FC497DA), UINT64_C(0x9BAC4EFC362EA149),
56 UINT64_C(0x158E0A85C2521623), UINT64_C(0x577EEB6E6BB820B0), UINT64_C(0x906FC95291867B05), UINT64_C(0xD29F28B9386C4D96),
57 UINT64_C(0xCEDBA04AD0952342), UINT64_C(0x8C2B41A1797F15D1), UINT64_C(0x4B3A639D83414E64), UINT64_C(0x9CA82762AAB78F7),
58 UINT64_C(0x87E8C60FDED7CF9D), UINT64_C(0xC51827E4773DF90E), UINT64_C(0x20905D88D03A2BB), UINT64_C(0x40F9E43324E99428),
59 UINT64_C(0x2CFFE7D5975E55E2), UINT64_C(0x6E0F063E3EB46371), UINT64_C(0xA91E2402C48A38C4), UINT64_C(0xEBEEC5E96D600E57),
60 UINT64_C(0x65CC8190991CB93D), UINT64_C(0x273C607B30F68FAE), UINT64_C(0xE02D4247CAC8D41B), UINT64_C(0xA2DDA3AC6322E288),
61 UINT64_C(0xBE992B5F8BDB8C5C), UINT64_C(0xFC69CAB42231BACF), UINT64_C(0x3B78E888D80FE17A), UINT64_C(0x7988096371E5D7E9),
62 UINT64_C(0xF7AA4D1A85996083), UINT64_C(0xB55AACF12C735610), UINT64_C(0x724B8ECDD64D0DA5), UINT64_C(0x30BB6F267FA73B36),
63 UINT64_C(0x4AC29F2A07BFD00D), UINT64_C(0x8327EC1AE55E69E), UINT64_C(0xCF235CFD546BBD2B), UINT64_C(0x8DD3BD16FD818BB8),
64 UINT64_C(0x3F1F96F09FD3CD2), UINT64_C(0x41011884A0170A41), UINT64_C(0x86103AB85A2951F4), UINT64_C(0xC4E0DB53F3C36767),
65 UINT64_C(0xD8A453A01B3A09B3), UINT64_C(0x9A54B24BB2D03F20), UINT64_C(0x5D45907748EE6495), UINT64_C(0x1FB5719CE1045206),
66 UINT64_C(0x919735E51578E56C), UINT64_C(0xD367D40EBC92D3FF), UINT64_C(0x1476F63246AC884A), UINT64_C(0x568617D9EF46BED9),
67 UINT64_C(0xE085162AB69D5E3C), UINT64_C(0xA275F7C11F7768AF), UINT64_C(0x6564D5FDE549331A), UINT64_C(0x279434164CA30589),
68 UINT64_C(0xA9B6706FB8DFB2E3), UINT64_C(0xEB46918411358470), UINT64_C(0x2C57B3B8EB0BDFC5), UINT64_C(0x6EA7525342E1E956),
69 UINT64_C(0x72E3DAA0AA188782), UINT64_C(0x30133B4B03F2B111), UINT64_C(0xF7021977F9CCEAA4), UINT64_C(0xB5F2F89C5026DC37),
70 UINT64_C(0x3BD0BCE5A45A6B5D), UINT64_C(0x79205D0E0DB05DCE), UINT64_C(0xBE317F32F78E067B), UINT64_C(0xFCC19ED95E6430E8),
71 UINT64_C(0x86B86ED5267CDBD3), UINT64_C(0xC4488F3E8F96ED40), UINT64_C(0x359AD0275A8B6F5), UINT64_C(0x41A94CE9DC428066),
72 UINT64_C(0xCF8B0890283E370C), UINT64_C(0x8D7BE97B81D4019F), UINT64_C(0x4A6ACB477BEA5A2A), UINT64_C(0x89A2AACD2006CB9),
73 UINT64_C(0x14DEA25F3AF9026D), UINT64_C(0x562E43B4931334FE), UINT64_C(0x913F6188692D6F4B), UINT64_C(0xD3CF8063C0C759D8),
74 UINT64_C(0x5DEDC41A34BBEEB2), UINT64_C(0x1F1D25F19D51D821), UINT64_C(0xD80C07CD676F8394), UINT64_C(0x9AFCE626CE85B507),
76static constexpr uint64_t crc64_power_table[64] = {
77 UINT64_C(0x100), UINT64_C(0x10000), UINT64_C(0x100000000), UINT64_C(0x42F0E1EBA9EA3693),
78 UINT64_C(0x5F5C3C7EB52FAB6), UINT64_C(0x571BEE0A227EF92B), UINT64_C(0x5F6843CA540DF020), UINT64_C(0x5CF79DEA9AC37D6),
79 UINT64_C(0x7F52691A60DDC70D), UINT64_C(0x1C6FFB45E31EA184), UINT64_C(0x4F3ABB24F049DDB6), UINT64_C(0xAD7AB2DB3F30285E),
80 UINT64_C(0xDEA023D37A0ECD82), UINT64_C(0x578353356A6D562B), UINT64_C(0xCEDF2C3F65B7D94C), UINT64_C(0xE9E9D0AC2B3F258A),
81 UINT64_C(0xB975F7EC6A15F28C), UINT64_C(0x48AB18A8597E4F35), UINT64_C(0xE731B2511CC547FF), UINT64_C(0x727433067E969D12),
82 UINT64_C(0x6246BB1ED3CE5B5), UINT64_C(0xDD83A731B2A2A57C), UINT64_C(0x8F57F0E365C7217A), UINT64_C(0x8B81BD366D92BF09),
83 UINT64_C(0x172A4DB8307C2947), UINT64_C(0x852C11537B565F37), UINT64_C(0x84C77C9A4847C8AF), UINT64_C(0x6890208CCEA756CF),
84 UINT64_C(0xE8E6DE1DCCCBDFC6), UINT64_C(0xD1D0AF4A871F06BD), UINT64_C(0xBE6A8399415273A5), UINT64_C(0x77AADBD30FA22BD0),
85 UINT64_C(0xA142C80472416BBF), UINT64_C(0x5E4445BD76D1B573), UINT64_C(0x3ADF2BAF27E8D227), UINT64_C(0xA3E5380B581394D9),
86 UINT64_C(0xAA0257F02766C2D8), UINT64_C(0xDE687558AA853DE4), UINT64_C(0x96A59CD8B3DEA55), UINT64_C(0x9DB2C485FC173FEB),
87 UINT64_C(0x71FFC57F76192733), UINT64_C(0x8F82CA679B25406C), UINT64_C(0xA2868AFB45B8D44E), UINT64_C(0xC15B105CBBBC3F37),
88 UINT64_C(0x67E0AC1533B69DF0), UINT64_C(0x10F0EB1E7F4FA48), UINT64_C(0x68A558A6ED0AF421), UINT64_C(0xF6C19B31182C3D90),
89 UINT64_C(0x909B698213666C2F), UINT64_C(0xD336FB030CD7F6AD), UINT64_C(0x1A90CFE732076655), UINT64_C(0xE2A94F597E188DED),
90 UINT64_C(0x7BA926E21FAA4C88), UINT64_C(0x7EEBA90C1EF98DF1), UINT64_C(0xCC8D413E33552375), UINT64_C(0xF314218490B6726F),
91 UINT64_C(0x51A435A574E56C0), UINT64_C(0x56555ED748F7AC4A), UINT64_C(0xCA1EA6A168DEB7F4), UINT64_C(0xADF60662B8A91F71),
92 UINT64_C(0x28B2C0F090831AB9), UINT64_C(0xDE955BF959A36F6C), UINT64_C(0x49A41619BE8AB47D), UINT64_C(0x8F94EAF7F1CEB3DE),
96#define CRC32_POLYNOMIAL UINT32_C(0x1EDC6F41)
97#define CRC32_NORMALISED_POLYNOMIAL UINT32_C(0x82F63B78)
98#define CRC32_REFLECTED true
99static constexpr uint32_t crc32_table[256] = {
100 UINT32_C(0x0), UINT32_C(0xF26B8303), UINT32_C(0xE13B70F7), UINT32_C(0x1350F3F4),
101 UINT32_C(0xC79A971F), UINT32_C(0x35F1141C), UINT32_C(0x26A1E7E8), UINT32_C(0xD4CA64EB),
102 UINT32_C(0x8AD958CF), UINT32_C(0x78B2DBCC), UINT32_C(0x6BE22838), UINT32_C(0x9989AB3B),
103 UINT32_C(0x4D43CFD0), UINT32_C(0xBF284CD3), UINT32_C(0xAC78BF27), UINT32_C(0x5E133C24),
104 UINT32_C(0x105EC76F), UINT32_C(0xE235446C), UINT32_C(0xF165B798), UINT32_C(0x30E349B),
105 UINT32_C(0xD7C45070), UINT32_C(0x25AFD373), UINT32_C(0x36FF2087), UINT32_C(0xC494A384),
106 UINT32_C(0x9A879FA0), UINT32_C(0x68EC1CA3), UINT32_C(0x7BBCEF57), UINT32_C(0x89D76C54),
107 UINT32_C(0x5D1D08BF), UINT32_C(0xAF768BBC), UINT32_C(0xBC267848), UINT32_C(0x4E4DFB4B),
108 UINT32_C(0x20BD8EDE), UINT32_C(0xD2D60DDD), UINT32_C(0xC186FE29), UINT32_C(0x33ED7D2A),
109 UINT32_C(0xE72719C1), UINT32_C(0x154C9AC2), UINT32_C(0x61C6936), UINT32_C(0xF477EA35),
110 UINT32_C(0xAA64D611), UINT32_C(0x580F5512), UINT32_C(0x4B5FA6E6), UINT32_C(0xB93425E5),
111 UINT32_C(0x6DFE410E), UINT32_C(0x9F95C20D), UINT32_C(0x8CC531F9), UINT32_C(0x7EAEB2FA),
112 UINT32_C(0x30E349B1), UINT32_C(0xC288CAB2), UINT32_C(0xD1D83946), UINT32_C(0x23B3BA45),
113 UINT32_C(0xF779DEAE), UINT32_C(0x5125DAD), UINT32_C(0x1642AE59), UINT32_C(0xE4292D5A),
114 UINT32_C(0xBA3A117E), UINT32_C(0x4851927D), UINT32_C(0x5B016189), UINT32_C(0xA96AE28A),
115 UINT32_C(0x7DA08661), UINT32_C(0x8FCB0562), UINT32_C(0x9C9BF696), UINT32_C(0x6EF07595),
116 UINT32_C(0x417B1DBC), UINT32_C(0xB3109EBF), UINT32_C(0xA0406D4B), UINT32_C(0x522BEE48),
117 UINT32_C(0x86E18AA3), UINT32_C(0x748A09A0), UINT32_C(0x67DAFA54), UINT32_C(0x95B17957),
118 UINT32_C(0xCBA24573), UINT32_C(0x39C9C670), UINT32_C(0x2A993584), UINT32_C(0xD8F2B687),
119 UINT32_C(0xC38D26C), UINT32_C(0xFE53516F), UINT32_C(0xED03A29B), UINT32_C(0x1F682198),
120 UINT32_C(0x5125DAD3), UINT32_C(0xA34E59D0), UINT32_C(0xB01EAA24), UINT32_C(0x42752927),
121 UINT32_C(0x96BF4DCC), UINT32_C(0x64D4CECF), UINT32_C(0x77843D3B), UINT32_C(0x85EFBE38),
122 UINT32_C(0xDBFC821C), UINT32_C(0x2997011F), UINT32_C(0x3AC7F2EB), UINT32_C(0xC8AC71E8),
123 UINT32_C(0x1C661503), UINT32_C(0xEE0D9600), UINT32_C(0xFD5D65F4), UINT32_C(0xF36E6F7),
124 UINT32_C(0x61C69362), UINT32_C(0x93AD1061), UINT32_C(0x80FDE395), UINT32_C(0x72966096),
125 UINT32_C(0xA65C047D), UINT32_C(0x5437877E), UINT32_C(0x4767748A), UINT32_C(0xB50CF789),
126 UINT32_C(0xEB1FCBAD), UINT32_C(0x197448AE), UINT32_C(0xA24BB5A), UINT32_C(0xF84F3859),
127 UINT32_C(0x2C855CB2), UINT32_C(0xDEEEDFB1), UINT32_C(0xCDBE2C45), UINT32_C(0x3FD5AF46),
128 UINT32_C(0x7198540D), UINT32_C(0x83F3D70E), UINT32_C(0x90A324FA), UINT32_C(0x62C8A7F9),
129 UINT32_C(0xB602C312), UINT32_C(0x44694011), UINT32_C(0x5739B3E5), UINT32_C(0xA55230E6),
130 UINT32_C(0xFB410CC2), UINT32_C(0x92A8FC1), UINT32_C(0x1A7A7C35), UINT32_C(0xE811FF36),
131 UINT32_C(0x3CDB9BDD), UINT32_C(0xCEB018DE), UINT32_C(0xDDE0EB2A), UINT32_C(0x2F8B6829),
132 UINT32_C(0x82F63B78), UINT32_C(0x709DB87B), UINT32_C(0x63CD4B8F), UINT32_C(0x91A6C88C),
133 UINT32_C(0x456CAC67), UINT32_C(0xB7072F64), UINT32_C(0xA457DC90), UINT32_C(0x563C5F93),
134 UINT32_C(0x82F63B7), UINT32_C(0xFA44E0B4), UINT32_C(0xE9141340), UINT32_C(0x1B7F9043),
135 UINT32_C(0xCFB5F4A8), UINT32_C(0x3DDE77AB), UINT32_C(0x2E8E845F), UINT32_C(0xDCE5075C),
136 UINT32_C(0x92A8FC17), UINT32_C(0x60C37F14), UINT32_C(0x73938CE0), UINT32_C(0x81F80FE3),
137 UINT32_C(0x55326B08), UINT32_C(0xA759E80B), UINT32_C(0xB4091BFF), UINT32_C(0x466298FC),
138 UINT32_C(0x1871A4D8), UINT32_C(0xEA1A27DB), UINT32_C(0xF94AD42F), UINT32_C(0xB21572C),
139 UINT32_C(0xDFEB33C7), UINT32_C(0x2D80B0C4), UINT32_C(0x3ED04330), UINT32_C(0xCCBBC033),
140 UINT32_C(0xA24BB5A6), UINT32_C(0x502036A5), UINT32_C(0x4370C551), UINT32_C(0xB11B4652),
141 UINT32_C(0x65D122B9), UINT32_C(0x97BAA1BA), UINT32_C(0x84EA524E), UINT32_C(0x7681D14D),
142 UINT32_C(0x2892ED69), UINT32_C(0xDAF96E6A), UINT32_C(0xC9A99D9E), UINT32_C(0x3BC21E9D),
143 UINT32_C(0xEF087A76), UINT32_C(0x1D63F975), UINT32_C(0xE330A81), UINT32_C(0xFC588982),
144 UINT32_C(0xB21572C9), UINT32_C(0x407EF1CA), UINT32_C(0x532E023E), UINT32_C(0xA145813D),
145 UINT32_C(0x758FE5D6), UINT32_C(0x87E466D5), UINT32_C(0x94B49521), UINT32_C(0x66DF1622),
146 UINT32_C(0x38CC2A06), UINT32_C(0xCAA7A905), UINT32_C(0xD9F75AF1), UINT32_C(0x2B9CD9F2),
147 UINT32_C(0xFF56BD19), UINT32_C(0xD3D3E1A), UINT32_C(0x1E6DCDEE), UINT32_C(0xEC064EED),
148 UINT32_C(0xC38D26C4), UINT32_C(0x31E6A5C7), UINT32_C(0x22B65633), UINT32_C(0xD0DDD530),
149 UINT32_C(0x417B1DB), UINT32_C(0xF67C32D8), UINT32_C(0xE52CC12C), UINT32_C(0x1747422F),
150 UINT32_C(0x49547E0B), UINT32_C(0xBB3FFD08), UINT32_C(0xA86F0EFC), UINT32_C(0x5A048DFF),
151 UINT32_C(0x8ECEE914), UINT32_C(0x7CA56A17), UINT32_C(0x6FF599E3), UINT32_C(0x9D9E1AE0),
152 UINT32_C(0xD3D3E1AB), UINT32_C(0x21B862A8), UINT32_C(0x32E8915C), UINT32_C(0xC083125F),
153 UINT32_C(0x144976B4), UINT32_C(0xE622F5B7), UINT32_C(0xF5720643), UINT32_C(0x7198540),
154 UINT32_C(0x590AB964), UINT32_C(0xAB613A67), UINT32_C(0xB831C993), UINT32_C(0x4A5A4A90),
155 UINT32_C(0x9E902E7B), UINT32_C(0x6CFBAD78), UINT32_C(0x7FAB5E8C), UINT32_C(0x8DC0DD8F),
156 UINT32_C(0xE330A81A), UINT32_C(0x115B2B19), UINT32_C(0x20BD8ED), UINT32_C(0xF0605BEE),
157 UINT32_C(0x24AA3F05), UINT32_C(0xD6C1BC06), UINT32_C(0xC5914FF2), UINT32_C(0x37FACCF1),
158 UINT32_C(0x69E9F0D5), UINT32_C(0x9B8273D6), UINT32_C(0x88D28022), UINT32_C(0x7AB90321),
159 UINT32_C(0xAE7367CA), UINT32_C(0x5C18E4C9), UINT32_C(0x4F48173D), UINT32_C(0xBD23943E),
160 UINT32_C(0xF36E6F75), UINT32_C(0x105EC76), UINT32_C(0x12551F82), UINT32_C(0xE03E9C81),
161 UINT32_C(0x34F4F86A), UINT32_C(0xC69F7B69), UINT32_C(0xD5CF889D), UINT32_C(0x27A40B9E),
162 UINT32_C(0x79B737BA), UINT32_C(0x8BDCB4B9), UINT32_C(0x988C474D), UINT32_C(0x6AE7C44E),
163 UINT32_C(0xBE2DA0A5), UINT32_C(0x4C4623A6), UINT32_C(0x5F16D052), UINT32_C(0xAD7D5351),
165static constexpr uint32_t crc32_power_table[64] = {
166 UINT32_C(0x100), UINT32_C(0x10000), UINT32_C(0x1EDC6F41), UINT32_C(0x3AAB4576),
167 UINT32_C(0x18571D18), UINT32_C(0x59A3508A), UINT32_C(0xAA97D41D), UINT32_C(0xE78DBF1D),
168 UINT32_C(0x4EF6A711), UINT32_C(0x2506C32E), UINT32_C(0x68D4E827), UINT32_C(0x546EA6B0),
169 UINT32_C(0x465CEBAC), UINT32_C(0x26A86214), UINT32_C(0x964AA2FD), UINT32_C(0x3B4C5747),
170 UINT32_C(0x6702EE7F), UINT32_C(0xD086629F), UINT32_C(0xF1F2043C), UINT32_C(0xC761A1CA),
171 UINT32_C(0xA8964E9A), UINT32_C(0x90CAB2CE), UINT32_C(0xC6E3583D), UINT32_C(0x3344E0BE),
172 UINT32_C(0x7D53914B), UINT32_C(0x3D953297), UINT32_C(0xFCF2EDA0), UINT32_C(0x42F878A5),
173 UINT32_C(0x2), UINT32_C(0x4), UINT32_C(0x10), UINT32_C(0x100),
174 UINT32_C(0x10000), UINT32_C(0x1EDC6F41), UINT32_C(0x3AAB4576), UINT32_C(0x18571D18),
175 UINT32_C(0x59A3508A), UINT32_C(0xAA97D41D), UINT32_C(0xE78DBF1D), UINT32_C(0x4EF6A711),
176 UINT32_C(0x2506C32E), UINT32_C(0x68D4E827), UINT32_C(0x546EA6B0), UINT32_C(0x465CEBAC),
177 UINT32_C(0x26A86214), UINT32_C(0x964AA2FD), UINT32_C(0x3B4C5747), UINT32_C(0x6702EE7F),
178 UINT32_C(0xD086629F), UINT32_C(0xF1F2043C), UINT32_C(0xC761A1CA), UINT32_C(0xA8964E9A),
179 UINT32_C(0x90CAB2CE), UINT32_C(0xC6E3583D), UINT32_C(0x3344E0BE), UINT32_C(0x7D53914B),
180 UINT32_C(0x3D953297), UINT32_C(0xFCF2EDA0), UINT32_C(0x42F878A5), UINT32_C(0x2),
181 UINT32_C(0x4), UINT32_C(0x10), UINT32_C(0x100), UINT32_C(0x10000),
185#define CRC24_POLYNOMIAL UINT32_C(0x864CFB)
186#define CRC24_NORMALISED_POLYNOMIAL UINT32_C(0x864CFB)
187#define CRC24_REFLECTED false
188static constexpr uint32_t crc24_table[256] = {
189 UINT32_C(0x0), UINT32_C(0x864CFB), UINT32_C(0x8AD50D), UINT32_C(0xC99F6),
190 UINT32_C(0x93E6E1), UINT32_C(0x15AA1A), UINT32_C(0x1933EC), UINT32_C(0x9F7F17),
191 UINT32_C(0xA18139), UINT32_C(0x27CDC2), UINT32_C(0x2B5434), UINT32_C(0xAD18CF),
192 UINT32_C(0x3267D8), UINT32_C(0xB42B23), UINT32_C(0xB8B2D5), UINT32_C(0x3EFE2E),
193 UINT32_C(0xC54E89), UINT32_C(0x430272), UINT32_C(0x4F9B84), UINT32_C(0xC9D77F),
194 UINT32_C(0x56A868), UINT32_C(0xD0E493), UINT32_C(0xDC7D65), UINT32_C(0x5A319E),
195 UINT32_C(0x64CFB0), UINT32_C(0xE2834B), UINT32_C(0xEE1ABD), UINT32_C(0x685646),
196 UINT32_C(0xF72951), UINT32_C(0x7165AA), UINT32_C(0x7DFC5C), UINT32_C(0xFBB0A7),
197 UINT32_C(0xCD1E9), UINT32_C(0x8A9D12), UINT32_C(0x8604E4), UINT32_C(0x481F),
198 UINT32_C(0x9F3708), UINT32_C(0x197BF3), UINT32_C(0x15E205), UINT32_C(0x93AEFE),
199 UINT32_C(0xAD50D0), UINT32_C(0x2B1C2B), UINT32_C(0x2785DD), UINT32_C(0xA1C926),
200 UINT32_C(0x3EB631), UINT32_C(0xB8FACA), UINT32_C(0xB4633C), UINT32_C(0x322FC7),
201 UINT32_C(0xC99F60), UINT32_C(0x4FD39B), UINT32_C(0x434A6D), UINT32_C(0xC50696),
202 UINT32_C(0x5A7981), UINT32_C(0xDC357A), UINT32_C(0xD0AC8C), UINT32_C(0x56E077),
203 UINT32_C(0x681E59), UINT32_C(0xEE52A2), UINT32_C(0xE2CB54), UINT32_C(0x6487AF),
204 UINT32_C(0xFBF8B8), UINT32_C(0x7DB443), UINT32_C(0x712DB5), UINT32_C(0xF7614E),
205 UINT32_C(0x19A3D2), UINT32_C(0x9FEF29), UINT32_C(0x9376DF), UINT32_C(0x153A24),
206 UINT32_C(0x8A4533), UINT32_C(0xC09C8), UINT32_C(0x903E), UINT32_C(0x86DCC5),
207 UINT32_C(0xB822EB), UINT32_C(0x3E6E10), UINT32_C(0x32F7E6), UINT32_C(0xB4BB1D),
208 UINT32_C(0x2BC40A), UINT32_C(0xAD88F1), UINT32_C(0xA11107), UINT32_C(0x275DFC),
209 UINT32_C(0xDCED5B), UINT32_C(0x5AA1A0), UINT32_C(0x563856), UINT32_C(0xD074AD),
210 UINT32_C(0x4F0BBA), UINT32_C(0xC94741), UINT32_C(0xC5DEB7), UINT32_C(0x43924C),
211 UINT32_C(0x7D6C62), UINT32_C(0xFB2099), UINT32_C(0xF7B96F), UINT32_C(0x71F594),
212 UINT32_C(0xEE8A83), UINT32_C(0x68C678), UINT32_C(0x645F8E), UINT32_C(0xE21375),
213 UINT32_C(0x15723B), UINT32_C(0x933EC0), UINT32_C(0x9FA736), UINT32_C(0x19EBCD),
214 UINT32_C(0x8694DA), UINT32_C(0xD821), UINT32_C(0xC41D7), UINT32_C(0x8A0D2C),
215 UINT32_C(0xB4F302), UINT32_C(0x32BFF9), UINT32_C(0x3E260F), UINT32_C(0xB86AF4),
216 UINT32_C(0x2715E3), UINT32_C(0xA15918), UINT32_C(0xADC0EE), UINT32_C(0x2B8C15),
217 UINT32_C(0xD03CB2), UINT32_C(0x567049), UINT32_C(0x5AE9BF), UINT32_C(0xDCA544),
218 UINT32_C(0x43DA53), UINT32_C(0xC596A8), UINT32_C(0xC90F5E), UINT32_C(0x4F43A5),
219 UINT32_C(0x71BD8B), UINT32_C(0xF7F170), UINT32_C(0xFB6886), UINT32_C(0x7D247D),
220 UINT32_C(0xE25B6A), UINT32_C(0x641791), UINT32_C(0x688E67), UINT32_C(0xEEC29C),
221 UINT32_C(0x3347A4), UINT32_C(0xB50B5F), UINT32_C(0xB992A9), UINT32_C(0x3FDE52),
222 UINT32_C(0xA0A145), UINT32_C(0x26EDBE), UINT32_C(0x2A7448), UINT32_C(0xAC38B3),
223 UINT32_C(0x92C69D), UINT32_C(0x148A66), UINT32_C(0x181390), UINT32_C(0x9E5F6B),
224 UINT32_C(0x1207C), UINT32_C(0x876C87), UINT32_C(0x8BF571), UINT32_C(0xDB98A),
225 UINT32_C(0xF6092D), UINT32_C(0x7045D6), UINT32_C(0x7CDC20), UINT32_C(0xFA90DB),
226 UINT32_C(0x65EFCC), UINT32_C(0xE3A337), UINT32_C(0xEF3AC1), UINT32_C(0x69763A),
227 UINT32_C(0x578814), UINT32_C(0xD1C4EF), UINT32_C(0xDD5D19), UINT32_C(0x5B11E2),
228 UINT32_C(0xC46EF5), UINT32_C(0x42220E), UINT32_C(0x4EBBF8), UINT32_C(0xC8F703),
229 UINT32_C(0x3F964D), UINT32_C(0xB9DAB6), UINT32_C(0xB54340), UINT32_C(0x330FBB),
230 UINT32_C(0xAC70AC), UINT32_C(0x2A3C57), UINT32_C(0x26A5A1), UINT32_C(0xA0E95A),
231 UINT32_C(0x9E1774), UINT32_C(0x185B8F), UINT32_C(0x14C279), UINT32_C(0x928E82),
232 UINT32_C(0xDF195), UINT32_C(0x8BBD6E), UINT32_C(0x872498), UINT32_C(0x16863),
233 UINT32_C(0xFAD8C4), UINT32_C(0x7C943F), UINT32_C(0x700DC9), UINT32_C(0xF64132),
234 UINT32_C(0x693E25), UINT32_C(0xEF72DE), UINT32_C(0xE3EB28), UINT32_C(0x65A7D3),
235 UINT32_C(0x5B59FD), UINT32_C(0xDD1506), UINT32_C(0xD18CF0), UINT32_C(0x57C00B),
236 UINT32_C(0xC8BF1C), UINT32_C(0x4EF3E7), UINT32_C(0x426A11), UINT32_C(0xC426EA),
237 UINT32_C(0x2AE476), UINT32_C(0xACA88D), UINT32_C(0xA0317B), UINT32_C(0x267D80),
238 UINT32_C(0xB90297), UINT32_C(0x3F4E6C), UINT32_C(0x33D79A), UINT32_C(0xB59B61),
239 UINT32_C(0x8B654F), UINT32_C(0xD29B4), UINT32_C(0x1B042), UINT32_C(0x87FCB9),
240 UINT32_C(0x1883AE), UINT32_C(0x9ECF55), UINT32_C(0x9256A3), UINT32_C(0x141A58),
241 UINT32_C(0xEFAAFF), UINT32_C(0x69E604), UINT32_C(0x657FF2), UINT32_C(0xE33309),
242 UINT32_C(0x7C4C1E), UINT32_C(0xFA00E5), UINT32_C(0xF69913), UINT32_C(0x70D5E8),
243 UINT32_C(0x4E2BC6), UINT32_C(0xC8673D), UINT32_C(0xC4FECB), UINT32_C(0x42B230),
244 UINT32_C(0xDDCD27), UINT32_C(0x5B81DC), UINT32_C(0x57182A), UINT32_C(0xD154D1),
245 UINT32_C(0x26359F), UINT32_C(0xA07964), UINT32_C(0xACE092), UINT32_C(0x2AAC69),
246 UINT32_C(0xB5D37E), UINT32_C(0x339F85), UINT32_C(0x3F0673), UINT32_C(0xB94A88),
247 UINT32_C(0x87B4A6), UINT32_C(0x1F85D), UINT32_C(0xD61AB), UINT32_C(0x8B2D50),
248 UINT32_C(0x145247), UINT32_C(0x921EBC), UINT32_C(0x9E874A), UINT32_C(0x18CBB1),
249 UINT32_C(0xE37B16), UINT32_C(0x6537ED), UINT32_C(0x69AE1B), UINT32_C(0xEFE2E0),
250 UINT32_C(0x709DF7), UINT32_C(0xF6D10C), UINT32_C(0xFA48FA), UINT32_C(0x7C0401),
251 UINT32_C(0x42FA2F), UINT32_C(0xC4B6D4), UINT32_C(0xC82F22), UINT32_C(0x4E63D9),
252 UINT32_C(0xD11CCE), UINT32_C(0x575035), UINT32_C(0x5BC9C3), UINT32_C(0xDD8538),
254static constexpr uint32_t crc24_power_table[64] = {
255 UINT32_C(0x100), UINT32_C(0x10000), UINT32_C(0x668F48), UINT32_C(0x36EB3D),
256 UINT32_C(0x6243DA), UINT32_C(0xCB800E), UINT32_C(0x7DB43E), UINT32_C(0xDEF23C),
257 UINT32_C(0x3D145A), UINT32_C(0xC5BF56), UINT32_C(0x11E898), UINT32_C(0xEACC65),
258 UINT32_C(0x893EB), UINT32_C(0xDBEA27), UINT32_C(0xEC11C0), UINT32_C(0x6EC0ED),
259 UINT32_C(0xE7B0EE), UINT32_C(0xDE2E52), UINT32_C(0x37A1AE), UINT32_C(0x85C31E),
260 UINT32_C(0x2), UINT32_C(0x4), UINT32_C(0x10), UINT32_C(0x100),
261 UINT32_C(0x10000), UINT32_C(0x668F48), UINT32_C(0x36EB3D), UINT32_C(0x6243DA),
262 UINT32_C(0xCB800E), UINT32_C(0x7DB43E), UINT32_C(0xDEF23C), UINT32_C(0x3D145A),
263 UINT32_C(0xC5BF56), UINT32_C(0x11E898), UINT32_C(0xEACC65), UINT32_C(0x893EB),
264 UINT32_C(0xDBEA27), UINT32_C(0xEC11C0), UINT32_C(0x6EC0ED), UINT32_C(0xE7B0EE),
265 UINT32_C(0xDE2E52), UINT32_C(0x37A1AE), UINT32_C(0x85C31E), UINT32_C(0x2),
266 UINT32_C(0x4), UINT32_C(0x10), UINT32_C(0x100), UINT32_C(0x10000),
267 UINT32_C(0x668F48), UINT32_C(0x36EB3D), UINT32_C(0x6243DA), UINT32_C(0xCB800E),
268 UINT32_C(0x7DB43E), UINT32_C(0xDEF23C), UINT32_C(0x3D145A), UINT32_C(0xC5BF56),
269 UINT32_C(0x11E898), UINT32_C(0xEACC65), UINT32_C(0x893EB), UINT32_C(0xDBEA27),
270 UINT32_C(0xEC11C0), UINT32_C(0x6EC0ED), UINT32_C(0xE7B0EE), UINT32_C(0xDE2E52),
274#define CRC16_POLYNOMIAL UINT16_C(0x1021)
275#define CRC16_NORMALISED_POLYNOMIAL UINT16_C(0x8408)
276#define CRC16_REFLECTED true
277static constexpr uint16_t crc16_table[256] = {
278 UINT16_C(0x0), UINT16_C(0x1189), UINT16_C(0x2312), UINT16_C(0x329B),
279 UINT16_C(0x4624), UINT16_C(0x57AD), UINT16_C(0x6536), UINT16_C(0x74BF),
280 UINT16_C(0x8C48), UINT16_C(0x9DC1), UINT16_C(0xAF5A), UINT16_C(0xBED3),
281 UINT16_C(0xCA6C), UINT16_C(0xDBE5), UINT16_C(0xE97E), UINT16_C(0xF8F7),
282 UINT16_C(0x1081), UINT16_C(0x108), UINT16_C(0x3393), UINT16_C(0x221A),
283 UINT16_C(0x56A5), UINT16_C(0x472C), UINT16_C(0x75B7), UINT16_C(0x643E),
284 UINT16_C(0x9CC9), UINT16_C(0x8D40), UINT16_C(0xBFDB), UINT16_C(0xAE52),
285 UINT16_C(0xDAED), UINT16_C(0xCB64), UINT16_C(0xF9FF), UINT16_C(0xE876),
286 UINT16_C(0x2102), UINT16_C(0x308B), UINT16_C(0x210), UINT16_C(0x1399),
287 UINT16_C(0x6726), UINT16_C(0x76AF), UINT16_C(0x4434), UINT16_C(0x55BD),
288 UINT16_C(0xAD4A), UINT16_C(0xBCC3), UINT16_C(0x8E58), UINT16_C(0x9FD1),
289 UINT16_C(0xEB6E), UINT16_C(0xFAE7), UINT16_C(0xC87C), UINT16_C(0xD9F5),
290 UINT16_C(0x3183), UINT16_C(0x200A), UINT16_C(0x1291), UINT16_C(0x318),
291 UINT16_C(0x77A7), UINT16_C(0x662E), UINT16_C(0x54B5), UINT16_C(0x453C),
292 UINT16_C(0xBDCB), UINT16_C(0xAC42), UINT16_C(0x9ED9), UINT16_C(0x8F50),
293 UINT16_C(0xFBEF), UINT16_C(0xEA66), UINT16_C(0xD8FD), UINT16_C(0xC974),
294 UINT16_C(0x4204), UINT16_C(0x538D), UINT16_C(0x6116), UINT16_C(0x709F),
295 UINT16_C(0x420), UINT16_C(0x15A9), UINT16_C(0x2732), UINT16_C(0x36BB),
296 UINT16_C(0xCE4C), UINT16_C(0xDFC5), UINT16_C(0xED5E), UINT16_C(0xFCD7),
297 UINT16_C(0x8868), UINT16_C(0x99E1), UINT16_C(0xAB7A), UINT16_C(0xBAF3),
298 UINT16_C(0x5285), UINT16_C(0x430C), UINT16_C(0x7197), UINT16_C(0x601E),
299 UINT16_C(0x14A1), UINT16_C(0x528), UINT16_C(0x37B3), UINT16_C(0x263A),
300 UINT16_C(0xDECD), UINT16_C(0xCF44), UINT16_C(0xFDDF), UINT16_C(0xEC56),
301 UINT16_C(0x98E9), UINT16_C(0x8960), UINT16_C(0xBBFB), UINT16_C(0xAA72),
302 UINT16_C(0x6306), UINT16_C(0x728F), UINT16_C(0x4014), UINT16_C(0x519D),
303 UINT16_C(0x2522), UINT16_C(0x34AB), UINT16_C(0x630), UINT16_C(0x17B9),
304 UINT16_C(0xEF4E), UINT16_C(0xFEC7), UINT16_C(0xCC5C), UINT16_C(0xDDD5),
305 UINT16_C(0xA96A), UINT16_C(0xB8E3), UINT16_C(0x8A78), UINT16_C(0x9BF1),
306 UINT16_C(0x7387), UINT16_C(0x620E), UINT16_C(0x5095), UINT16_C(0x411C),
307 UINT16_C(0x35A3), UINT16_C(0x242A), UINT16_C(0x16B1), UINT16_C(0x738),
308 UINT16_C(0xFFCF), UINT16_C(0xEE46), UINT16_C(0xDCDD), UINT16_C(0xCD54),
309 UINT16_C(0xB9EB), UINT16_C(0xA862), UINT16_C(0x9AF9), UINT16_C(0x8B70),
310 UINT16_C(0x8408), UINT16_C(0x9581), UINT16_C(0xA71A), UINT16_C(0xB693),
311 UINT16_C(0xC22C), UINT16_C(0xD3A5), UINT16_C(0xE13E), UINT16_C(0xF0B7),
312 UINT16_C(0x840), UINT16_C(0x19C9), UINT16_C(0x2B52), UINT16_C(0x3ADB),
313 UINT16_C(0x4E64), UINT16_C(0x5FED), UINT16_C(0x6D76), UINT16_C(0x7CFF),
314 UINT16_C(0x9489), UINT16_C(0x8500), UINT16_C(0xB79B), UINT16_C(0xA612),
315 UINT16_C(0xD2AD), UINT16_C(0xC324), UINT16_C(0xF1BF), UINT16_C(0xE036),
316 UINT16_C(0x18C1), UINT16_C(0x948), UINT16_C(0x3BD3), UINT16_C(0x2A5A),
317 UINT16_C(0x5EE5), UINT16_C(0x4F6C), UINT16_C(0x7DF7), UINT16_C(0x6C7E),
318 UINT16_C(0xA50A), UINT16_C(0xB483), UINT16_C(0x8618), UINT16_C(0x9791),
319 UINT16_C(0xE32E), UINT16_C(0xF2A7), UINT16_C(0xC03C), UINT16_C(0xD1B5),
320 UINT16_C(0x2942), UINT16_C(0x38CB), UINT16_C(0xA50), UINT16_C(0x1BD9),
321 UINT16_C(0x6F66), UINT16_C(0x7EEF), UINT16_C(0x4C74), UINT16_C(0x5DFD),
322 UINT16_C(0xB58B), UINT16_C(0xA402), UINT16_C(0x9699), UINT16_C(0x8710),
323 UINT16_C(0xF3AF), UINT16_C(0xE226), UINT16_C(0xD0BD), UINT16_C(0xC134),
324 UINT16_C(0x39C3), UINT16_C(0x284A), UINT16_C(0x1AD1), UINT16_C(0xB58),
325 UINT16_C(0x7FE7), UINT16_C(0x6E6E), UINT16_C(0x5CF5), UINT16_C(0x4D7C),
326 UINT16_C(0xC60C), UINT16_C(0xD785), UINT16_C(0xE51E), UINT16_C(0xF497),
327 UINT16_C(0x8028), UINT16_C(0x91A1), UINT16_C(0xA33A), UINT16_C(0xB2B3),
328 UINT16_C(0x4A44), UINT16_C(0x5BCD), UINT16_C(0x6956), UINT16_C(0x78DF),
329 UINT16_C(0xC60), UINT16_C(0x1DE9), UINT16_C(0x2F72), UINT16_C(0x3EFB),
330 UINT16_C(0xD68D), UINT16_C(0xC704), UINT16_C(0xF59F), UINT16_C(0xE416),
331 UINT16_C(0x90A9), UINT16_C(0x8120), UINT16_C(0xB3BB), UINT16_C(0xA232),
332 UINT16_C(0x5AC5), UINT16_C(0x4B4C), UINT16_C(0x79D7), UINT16_C(0x685E),
333 UINT16_C(0x1CE1), UINT16_C(0xD68), UINT16_C(0x3FF3), UINT16_C(0x2E7A),
334 UINT16_C(0xE70E), UINT16_C(0xF687), UINT16_C(0xC41C), UINT16_C(0xD595),
335 UINT16_C(0xA12A), UINT16_C(0xB0A3), UINT16_C(0x8238), UINT16_C(0x93B1),
336 UINT16_C(0x6B46), UINT16_C(0x7ACF), UINT16_C(0x4854), UINT16_C(0x59DD),
337 UINT16_C(0x2D62), UINT16_C(0x3CEB), UINT16_C(0xE70), UINT16_C(0x1FF9),
338 UINT16_C(0xF78F), UINT16_C(0xE606), UINT16_C(0xD49D), UINT16_C(0xC514),
339 UINT16_C(0xB1AB), UINT16_C(0xA022), UINT16_C(0x92B9), UINT16_C(0x8330),
340 UINT16_C(0x7BC7), UINT16_C(0x6A4E), UINT16_C(0x58D5), UINT16_C(0x495C),
341 UINT16_C(0x3DE3), UINT16_C(0x2C6A), UINT16_C(0x1EF1), UINT16_C(0xF78),
343static constexpr uint16_t crc16_power_table[64] = {
344 UINT16_C(0x100), UINT16_C(0x1021), UINT16_C(0x3730), UINT16_C(0xB861),
345 UINT16_C(0xAEFC), UINT16_C(0x8E29), UINT16_C(0x13FC), UINT16_C(0x36C4),
346 UINT16_C(0xFD50), UINT16_C(0xAA9E), UINT16_C(0x881C), UINT16_C(0x4458),
347 UINT16_C(0x2), UINT16_C(0x4), UINT16_C(0x10), UINT16_C(0x100),
348 UINT16_C(0x1021), UINT16_C(0x3730), UINT16_C(0xB861), UINT16_C(0xAEFC),
349 UINT16_C(0x8E29), UINT16_C(0x13FC), UINT16_C(0x36C4), UINT16_C(0xFD50),
350 UINT16_C(0xAA9E), UINT16_C(0x881C), UINT16_C(0x4458), UINT16_C(0x2),
351 UINT16_C(0x4), UINT16_C(0x10), UINT16_C(0x100), UINT16_C(0x1021),
352 UINT16_C(0x3730), UINT16_C(0xB861), UINT16_C(0xAEFC), UINT16_C(0x8E29),
353 UINT16_C(0x13FC), UINT16_C(0x36C4), UINT16_C(0xFD50), UINT16_C(0xAA9E),
354 UINT16_C(0x881C), UINT16_C(0x4458), UINT16_C(0x2), UINT16_C(0x4),
355 UINT16_C(0x10), UINT16_C(0x100), UINT16_C(0x1021), UINT16_C(0x3730),
356 UINT16_C(0xB861), UINT16_C(0xAEFC), UINT16_C(0x8E29), UINT16_C(0x13FC),
357 UINT16_C(0x36C4), UINT16_C(0xFD50), UINT16_C(0xAA9E), UINT16_C(0x881C),
358 UINT16_C(0x4458), UINT16_C(0x2), UINT16_C(0x4), UINT16_C(0x10),
359 UINT16_C(0x100), UINT16_C(0x1021), UINT16_C(0x3730), UINT16_C(0xB861),
363#define CRC8_POLYNOMIAL UINT8_C(0x7)
364#define CRC8_NORMALISED_POLYNOMIAL UINT8_C(0x7)
365#define CRC8_REFLECTED false
366static constexpr uint8_t crc8_table[256] = {
367 UINT8_C(0x0), UINT8_C(0x7), UINT8_C(0xE), UINT8_C(0x9),
368 UINT8_C(0x1C), UINT8_C(0x1B), UINT8_C(0x12), UINT8_C(0x15),
369 UINT8_C(0x38), UINT8_C(0x3F), UINT8_C(0x36), UINT8_C(0x31),
370 UINT8_C(0x24), UINT8_C(0x23), UINT8_C(0x2A), UINT8_C(0x2D),
371 UINT8_C(0x70), UINT8_C(0x77), UINT8_C(0x7E), UINT8_C(0x79),
372 UINT8_C(0x6C), UINT8_C(0x6B), UINT8_C(0x62), UINT8_C(0x65),
373 UINT8_C(0x48), UINT8_C(0x4F), UINT8_C(0x46), UINT8_C(0x41),
374 UINT8_C(0x54), UINT8_C(0x53), UINT8_C(0x5A), UINT8_C(0x5D),
375 UINT8_C(0xE0), UINT8_C(0xE7), UINT8_C(0xEE), UINT8_C(0xE9),
376 UINT8_C(0xFC), UINT8_C(0xFB), UINT8_C(0xF2), UINT8_C(0xF5),
377 UINT8_C(0xD8), UINT8_C(0xDF), UINT8_C(0xD6), UINT8_C(0xD1),
378 UINT8_C(0xC4), UINT8_C(0xC3), UINT8_C(0xCA), UINT8_C(0xCD),
379 UINT8_C(0x90), UINT8_C(0x97), UINT8_C(0x9E), UINT8_C(0x99),
380 UINT8_C(0x8C), UINT8_C(0x8B), UINT8_C(0x82), UINT8_C(0x85),
381 UINT8_C(0xA8), UINT8_C(0xAF), UINT8_C(0xA6), UINT8_C(0xA1),
382 UINT8_C(0xB4), UINT8_C(0xB3), UINT8_C(0xBA), UINT8_C(0xBD),
383 UINT8_C(0xC7), UINT8_C(0xC0), UINT8_C(0xC9), UINT8_C(0xCE),
384 UINT8_C(0xDB), UINT8_C(0xDC), UINT8_C(0xD5), UINT8_C(0xD2),
385 UINT8_C(0xFF), UINT8_C(0xF8), UINT8_C(0xF1), UINT8_C(0xF6),
386 UINT8_C(0xE3), UINT8_C(0xE4), UINT8_C(0xED), UINT8_C(0xEA),
387 UINT8_C(0xB7), UINT8_C(0xB0), UINT8_C(0xB9), UINT8_C(0xBE),
388 UINT8_C(0xAB), UINT8_C(0xAC), UINT8_C(0xA5), UINT8_C(0xA2),
389 UINT8_C(0x8F), UINT8_C(0x88), UINT8_C(0x81), UINT8_C(0x86),
390 UINT8_C(0x93), UINT8_C(0x94), UINT8_C(0x9D), UINT8_C(0x9A),
391 UINT8_C(0x27), UINT8_C(0x20), UINT8_C(0x29), UINT8_C(0x2E),
392 UINT8_C(0x3B), UINT8_C(0x3C), UINT8_C(0x35), UINT8_C(0x32),
393 UINT8_C(0x1F), UINT8_C(0x18), UINT8_C(0x11), UINT8_C(0x16),
394 UINT8_C(0x3), UINT8_C(0x4), UINT8_C(0xD), UINT8_C(0xA),
395 UINT8_C(0x57), UINT8_C(0x50), UINT8_C(0x59), UINT8_C(0x5E),
396 UINT8_C(0x4B), UINT8_C(0x4C), UINT8_C(0x45), UINT8_C(0x42),
397 UINT8_C(0x6F), UINT8_C(0x68), UINT8_C(0x61), UINT8_C(0x66),
398 UINT8_C(0x73), UINT8_C(0x74), UINT8_C(0x7D), UINT8_C(0x7A),
399 UINT8_C(0x89), UINT8_C(0x8E), UINT8_C(0x87), UINT8_C(0x80),
400 UINT8_C(0x95), UINT8_C(0x92), UINT8_C(0x9B), UINT8_C(0x9C),
401 UINT8_C(0xB1), UINT8_C(0xB6), UINT8_C(0xBF), UINT8_C(0xB8),
402 UINT8_C(0xAD), UINT8_C(0xAA), UINT8_C(0xA3), UINT8_C(0xA4),
403 UINT8_C(0xF9), UINT8_C(0xFE), UINT8_C(0xF7), UINT8_C(0xF0),
404 UINT8_C(0xE5), UINT8_C(0xE2), UINT8_C(0xEB), UINT8_C(0xEC),
405 UINT8_C(0xC1), UINT8_C(0xC6), UINT8_C(0xCF), UINT8_C(0xC8),
406 UINT8_C(0xDD), UINT8_C(0xDA), UINT8_C(0xD3), UINT8_C(0xD4),
407 UINT8_C(0x69), UINT8_C(0x6E), UINT8_C(0x67), UINT8_C(0x60),
408 UINT8_C(0x75), UINT8_C(0x72), UINT8_C(0x7B), UINT8_C(0x7C),
409 UINT8_C(0x51), UINT8_C(0x56), UINT8_C(0x5F), UINT8_C(0x58),
410 UINT8_C(0x4D), UINT8_C(0x4A), UINT8_C(0x43), UINT8_C(0x44),
411 UINT8_C(0x19), UINT8_C(0x1E), UINT8_C(0x17), UINT8_C(0x10),
412 UINT8_C(0x5), UINT8_C(0x2), UINT8_C(0xB), UINT8_C(0xC),
413 UINT8_C(0x21), UINT8_C(0x26), UINT8_C(0x2F), UINT8_C(0x28),
414 UINT8_C(0x3D), UINT8_C(0x3A), UINT8_C(0x33), UINT8_C(0x34),
415 UINT8_C(0x4E), UINT8_C(0x49), UINT8_C(0x40), UINT8_C(0x47),
416 UINT8_C(0x52), UINT8_C(0x55), UINT8_C(0x5C), UINT8_C(0x5B),
417 UINT8_C(0x76), UINT8_C(0x71), UINT8_C(0x78), UINT8_C(0x7F),
418 UINT8_C(0x6A), UINT8_C(0x6D), UINT8_C(0x64), UINT8_C(0x63),
419 UINT8_C(0x3E), UINT8_C(0x39), UINT8_C(0x30), UINT8_C(0x37),
420 UINT8_C(0x22), UINT8_C(0x25), UINT8_C(0x2C), UINT8_C(0x2B),
421 UINT8_C(0x6), UINT8_C(0x1), UINT8_C(0x8), UINT8_C(0xF),
422 UINT8_C(0x1A), UINT8_C(0x1D), UINT8_C(0x14), UINT8_C(0x13),
423 UINT8_C(0xAE), UINT8_C(0xA9), UINT8_C(0xA0), UINT8_C(0xA7),
424 UINT8_C(0xB2), UINT8_C(0xB5), UINT8_C(0xBC), UINT8_C(0xBB),
425 UINT8_C(0x96), UINT8_C(0x91), UINT8_C(0x98), UINT8_C(0x9F),
426 UINT8_C(0x8A), UINT8_C(0x8D), UINT8_C(0x84), UINT8_C(0x83),
427 UINT8_C(0xDE), UINT8_C(0xD9), UINT8_C(0xD0), UINT8_C(0xD7),
428 UINT8_C(0xC2), UINT8_C(0xC5), UINT8_C(0xCC), UINT8_C(0xCB),
429 UINT8_C(0xE6), UINT8_C(0xE1), UINT8_C(0xE8), UINT8_C(0xEF),
430 UINT8_C(0xFA), UINT8_C(0xFD), UINT8_C(0xF4), UINT8_C(0xF3),
432static constexpr uint8_t crc8_power_table[64] = {
433 UINT8_C(0x7), UINT8_C(0x15), UINT8_C(0x16), UINT8_C(0x13),
434 UINT8_C(0x2), UINT8_C(0x4), UINT8_C(0x10), UINT8_C(0x7),
435 UINT8_C(0x15), UINT8_C(0x16), UINT8_C(0x13), UINT8_C(0x2),
436 UINT8_C(0x4), UINT8_C(0x10), UINT8_C(0x7), UINT8_C(0x15),
437 UINT8_C(0x16), UINT8_C(0x13), UINT8_C(0x2), UINT8_C(0x4),
438 UINT8_C(0x10), UINT8_C(0x7), UINT8_C(0x15), UINT8_C(0x16),
439 UINT8_C(0x13), UINT8_C(0x2), UINT8_C(0x4), UINT8_C(0x10),
440 UINT8_C(0x7), UINT8_C(0x15), UINT8_C(0x16), UINT8_C(0x13),
441 UINT8_C(0x2), UINT8_C(0x4), UINT8_C(0x10), UINT8_C(0x7),
442 UINT8_C(0x15), UINT8_C(0x16), UINT8_C(0x13), UINT8_C(0x2),
443 UINT8_C(0x4), UINT8_C(0x10), UINT8_C(0x7), UINT8_C(0x15),
444 UINT8_C(0x16), UINT8_C(0x13), UINT8_C(0x2), UINT8_C(0x4),
445 UINT8_C(0x10), UINT8_C(0x7), UINT8_C(0x15), UINT8_C(0x16),
446 UINT8_C(0x13), UINT8_C(0x2), UINT8_C(0x4), UINT8_C(0x10),
447 UINT8_C(0x7), UINT8_C(0x15), UINT8_C(0x16), UINT8_C(0x13),
448 UINT8_C(0x2), UINT8_C(0x4), UINT8_C(0x10), UINT8_C(0x7),