From 5ed76d6985234b94af7f600c20531675e0e18bef Mon Sep 17 00:00:00 2001 From: Jared Boone Date: Fri, 19 Feb 2016 14:13:15 -0800 Subject: [PATCH] Adler32 implementation (for PNG writer). --- firmware/common/crc.hpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp index f89df5333..31c214e3b 100644 --- a/firmware/common/crc.hpp +++ b/firmware/common/crc.hpp @@ -145,4 +145,42 @@ private: } }; +class Adler32 { +public: + void feed(const uint8_t v) { + feed_one(v); + } + + void feed(const uint8_t* const p, const size_t n) { + for(size_t i=0; i + void feed(const T& a) { + feed(a.data(), a.size()); + } + + std::array bytes() const { + return { + static_cast((b >> 8) & 0xff), + static_cast((b >> 0) & 0xff), + static_cast((a >> 8) & 0xff), + static_cast((a >> 0) & 0xff) + }; + } + +private: + static constexpr uint32_t mod = 65521; + + uint32_t a { 1 }; + uint32_t b { 0 }; + + void feed_one(const uint8_t c) { + a = (a + c) % mod; + b = (b + a) % mod; + } +}; + #endif/*__CRC_H__*/