-
Notifications
You must be signed in to change notification settings - Fork 9
/
crc.cc
69 lines (55 loc) · 2.91 KB
/
crc.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Copyright (c) 2015-2019, FlightAware LLC.
// Copyright (c) 2015, Oliver Jowett <[email protected]>
// All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// * Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <iomanip>
#include <iostream>
#include "crc.h"
#include <boost/preprocessor/repetition/enum.hpp>
namespace crc {
namespace detail {
// generates the CRC table at compile time (!)
const std::uint32_t crc_polynomial = 0xfff409U;
template <std::uint32_t c, int k = 8> struct crcgen : crcgen<((c & 0x00800000) ? crc_polynomial : 0) ^ (c << 1), k - 1> {};
template <std::uint32_t c> struct crcgen<c, 0> {
enum { value = (c & 0x00FFFFFF) };
};
#define CRCGEN(Z, N, _) detail::crcgen<N << 16>::value
std::uint32_t crc_table[256] = {BOOST_PP_ENUM(256, CRCGEN, _)};
#undef CRCGEN
std::map<std::uint32_t, unsigned> syndromes_short;
std::map<std::uint32_t, unsigned> syndromes_long;
void init_syndromes() {
syndromes_short.clear();
std::vector<std::uint8_t> message_short(56 / 8);
for (unsigned i = 5; i < 56; ++i) {
message_short[i / 8] ^= 1 << (7 - (i & 7));
syndromes_short[message_residual(message_short)] = i;
message_short[i / 8] ^= 1 << (7 - (i & 7));
}
syndromes_long.clear();
std::vector<std::uint8_t> message_long(112 / 8);
for (unsigned i = 5; i < 112; ++i) {
message_long[i / 8] ^= 1 << (7 - (i & 7));
syndromes_long[message_residual(message_long)] = i;
message_long[i / 8] ^= 1 << (7 - (i & 7));
}
}
} // namespace detail
}; // namespace crc