diff options
Diffstat (limited to 'src/inc/stdalg.c')
-rwxr-xr-x | src/inc/stdalg.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/inc/stdalg.c b/src/inc/stdalg.c new file mode 100755 index 0000000..99558a9 --- /dev/null +++ b/src/inc/stdalg.c | |||
@@ -0,0 +1,29 @@ | |||
1 | #include "stdalg.h" | ||
2 | |||
3 | #ifdef STDALGO_CRC7 | ||
4 | unsigned char crc7(unsigned char* bytes, unsigned char size) | ||
5 | { | ||
6 | register unsigned char val = 0; // last cycles value | ||
7 | register unsigned char cb; // current byte. | ||
8 | |||
9 | unsigned char i; | ||
10 | for(i=0; i<=size; i++) | ||
11 | { | ||
12 | cb = bytes[i]; | ||
13 | |||
14 | int q = (i==size) ? 7 : 8; // counter | ||
15 | do | ||
16 | { | ||
17 | val <<= 1; | ||
18 | if(cb & 0x80) // check MSB of current byte | ||
19 | ++val; // overflow, add 1 | ||
20 | |||
21 | if(val & 0x80) // check MSB of (last) seed | ||
22 | val ^= 0x9; // polynome | ||
23 | cb <<= 1; | ||
24 | } while(--q); | ||
25 | val &= 0x7f; // lower 7 bits | ||
26 | } | ||
27 | return ((val<<1) + 1); | ||
28 | } | ||
29 | #endif | ||