您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

cobsEncode.c 1.1KB

12345678910111213141516171819202122232425262728293031
  1. //! \file cobsEncode.c copied from https://github.com/rokath/cobs
  2. //! \author Thomas.Hoehenleitner [at] seerose.net
  3. #include "cobs.h"
  4. //! COBSEncode encodes data to output.
  5. //! @param in Pointer to input data to encode.
  6. //! @param length Number of bytes to encode.
  7. //! @param out Pointer to encoded output buffer.
  8. //! @return Encoded buffer length in bytes.
  9. //! @note Does not output delimiter byte. Code taken from Wikipedia and slightly adapted.
  10. size_t COBSEncode(void* __restrict out, const void* __restrict in, size_t length) {
  11. uint8_t* buffer = out;
  12. uint8_t* encode = buffer; // Encoded byte pointer
  13. uint8_t* codep = encode++; // Output code pointer
  14. uint8_t code = 1; // Code value
  15. for (const uint8_t* byte = (const uint8_t*)in; length--; ++byte) {
  16. if (*byte) { // Byte not zero, write it
  17. *encode++ = *byte, ++code;
  18. }
  19. if (!*byte || code == 0xff) { // Input is zero or block completed, restart
  20. *codep = code, code = 1, codep = encode;
  21. if (!*byte || length) {
  22. ++encode;
  23. }
  24. }
  25. }
  26. *codep = code; // Write final code value
  27. return (size_t)(encode - buffer);
  28. }