+/**
+ * Inverts the ordering of bits inside a 32-bit word (e.g. 31..0 -> 0..31).
+ * This routine can be used to flip smaller data types by using smaller
+ * values for @c width.
+ * @param value The word to flip.
+ * @param width The number of bits in value (2-32).
+ * @returns A 32-bit word with @c value in reversed bit-order.
+ */
+uint32_t flip_u32(uint32_t value, unsigned width);
+
+bool buf_cmp(const void *buf1, const void *buf2, unsigned size);
+bool buf_cmp_mask(const void *buf1, const void *buf2,
+ const void *mask, unsigned size);
+
+/**
+ * Copies @c size bits out of @c from and into @c to. Any extra
+ * bits in the final byte will be set to zero.
+ * @param from The buffer to copy into @c to.
+ * @param to The buffer that will receive the copy of @c from.
+ * @param size The number of bits to copy.
+ */
+void *buf_cpy(const void *from, void *to, unsigned size);
+
+/**
+ * Set the contents of @c buf with @c count bits, all set to 1.
+ * @param buf The buffer to fill with ones.
+ * @param size The number of bits.
+ * @returns The original buffer (@c buf).
+ */
+void *buf_set_ones(void *buf, unsigned size);
+
+void *buf_set_buf(const void *src, unsigned src_start,
+ void *dst, unsigned dst_start, unsigned len);
+
+int str_to_buf(const char *str, unsigned len,
+ void *bin_buf, unsigned buf_size, unsigned radix);
+char *buf_to_str(const void *buf, unsigned size, unsigned radix);
+
+/* read a uint32_t from a buffer in target memory endianness */
+static inline uint32_t fast_target_buffer_get_u32(const void *p, bool le)
+{
+ return le ? le_to_h_u32(p) : be_to_h_u32(p);
+}
+
+static inline void bit_copy(uint8_t *dst, unsigned dst_offset, const uint8_t *src,
+ unsigned src_offset, unsigned bit_count)