MRAS
Multi Rocket Avionics System
Loading...
Searching...
No Matches
cobs_encoding.h
1//
2// Created by Tom Danvers on 17/02/2023.
3//
4
5#ifndef MRAS_COBS_ENCODING_H
6#define MRAS_COBS_ENCODING_H
7
8#include <cstddef>
9#include <cstdint>
10#include <cassert>
11
12// This code has been yoinked straight from Wikipedia
13// https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing
14
22size_t cobsEncode(const void *data, size_t length, uint8_t *buffer)
23{
24 assert(data && buffer);
25
26 uint8_t *encode = buffer; // Encoded byte pointer
27 uint8_t *codep = encode++; // Output code pointer
28 uint8_t code = 1; // Code value
29
30 for (const auto *byte = (const uint8_t *)data; length--; ++byte)
31 {
32 if (*byte) // Byte not zero, write it
33 *encode++ = *byte, ++code;
34
35 if (!*byte || code == 0xff) // Input is zero or block completed, restart
36 {
37 *codep = code, code = 1, codep = encode;
38 if (!*byte || length)
39 ++encode;
40 }
41 }
42 *codep = code; // Write final code value
43
44 return (size_t)(encode - buffer);
45}
46
54size_t cobsDecode(const uint8_t *buffer, size_t length, void *data)
55{
56 assert(buffer && data);
57
58 const uint8_t *byte = buffer; // Encoded input byte pointer
59 uint8_t *decode = (uint8_t *)data; // Decoded output byte pointer
60
61 for (uint8_t code = 0xff, block = 0; byte < buffer + length; --block)
62 {
63 if (block) // Decode block byte
64 *decode++ = *byte++;
65 else
66 {
67 if (code != 0xff) // Encoded zero, write it
68 *decode++ = 0;
69 block = code = *byte++; // Next block length
70 if (!code) // Delimiter code found
71 break;
72 }
73 }
74
75 return (size_t)(decode - (uint8_t *)data);
76}
77
78#endif //MRAS_COBS_ENCODING_H