| 12345678910111213141516171819202122232425262728293031 |
- //! \file cobsEncode.c copied from https://github.com/rokath/cobs
- //! \author Thomas.Hoehenleitner [at] seerose.net
-
- #include "cobs.h"
-
- //! COBSEncode encodes data to output.
- //! @param in Pointer to input data to encode.
- //! @param length Number of bytes to encode.
- //! @param out Pointer to encoded output buffer.
- //! @return Encoded buffer length in bytes.
- //! @note Does not output delimiter byte. Code taken from Wikipedia and slightly adapted.
- size_t COBSEncode(void* __restrict out, const void* __restrict in, size_t length) {
- uint8_t* buffer = out;
- uint8_t* encode = buffer; // Encoded byte pointer
- uint8_t* codep = encode++; // Output code pointer
- uint8_t code = 1; // Code value
-
- for (const uint8_t* byte = (const uint8_t*)in; length--; ++byte) {
- if (*byte) { // Byte not zero, write it
- *encode++ = *byte, ++code;
- }
- if (!*byte || code == 0xff) { // Input is zero or block completed, restart
- *codep = code, code = 1, codep = encode;
- if (!*byte || length) {
- ++encode;
- }
- }
- }
- *codep = code; // Write final code value
- return (size_t)(encode - buffer);
- }
|