Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

cobsDecode.c 1.1KB

1234567891011121314151617181920212223242526272829303132
  1. //! \file cobsDecode.c copied from https://github.com/rokath/cobs
  2. //! \author Thomas.Hoehenleitner [at] seerose.net
  3. #include "cobs.h"
  4. //! COBSDecode decodes data from in buffer.
  5. //! @param in Pointer to encoded input bytes.
  6. //! @param length Number of bytes to decode.
  7. //! @param out Pointer to decoded output data.
  8. //! @return Number of bytes successfully decoded.
  9. //! @note Stops decoding if delimiter byte is found. Code taken from Wikipedia and slightly modified.
  10. size_t COBSDecode(void* __restrict out, const void* __restrict in, size_t length) {
  11. uint8_t* data = out;
  12. const uint8_t* buffer = in;
  13. const uint8_t* byte = buffer; // Encoded input byte pointer
  14. uint8_t* decode = (uint8_t*)data; // Decoded output byte pointer
  15. for (uint8_t code = 0xff, block = 0; byte < buffer + length; --block) {
  16. if (block) { // Decode block byte
  17. *decode++ = *byte++;
  18. } else {
  19. if (code != 0xff) { // Encoded zero, write it
  20. *decode++ = 0;
  21. }
  22. block = code = *byte++; // Next block length
  23. if (!code) { // Delimiter code found
  24. break;
  25. }
  26. }
  27. }
  28. return (size_t)(decode - data);
  29. }