Blob: crc.c
Blob id: 8d0e31db957406c7defc4bbf11a390285e356a9f
Size: 1.2 KB
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 70 71 | // SPDX-License-Identifier: LGPL-2.1-or-later /* * * BlueZ - Bluetooth protocol stack for Linux * * Copyright (C) 2011-2014 Intel Corporation * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org> * * */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include "crc.h" uint32_t crc24_bit_reverse(uint32_t value) { uint32_t result = 0; uint8_t i; for (i = 0; i < 24; i++) result |= ((value >> i) & 1) << (23 - i); return result; } uint32_t crc24_calculate(uint32_t preset, const uint8_t *data, uint8_t len) { uint32_t state = preset; uint8_t i; for (i = 0; i < len; i++) { uint8_t n, cur = data[i]; for (n = 0; n < 8; n++) { int next_bit = (state ^ cur) & 1; cur >>= 1; state >>= 1; if (next_bit) { state |= 1 << 23; state ^= 0x5a6000; } } } return state; } uint32_t crc24_reverse(uint32_t crc, const uint8_t *data, uint8_t len) { uint32_t state = crc; uint8_t i; for (i = 0; i < len; i++) { uint8_t n, cur = data[len - i - 1]; for (n = 0; n < 8; n++) { int top_bit = state >> 23; state = (state << 1) & 0xffffff; state |= top_bit ^ ((cur >> (7 - n)) & 1); if (top_bit) state ^= 0xb4c000; } } return state; } |