17 #include <glog/logging.h> 28 : data_(data), size_(data_size), bit_offset_(0) {}
37 if (bit_offset_ == 0) {
38 const uint8_t* src = data_;
39 const size_t to_read =
Skip(dest_size);
40 std::memcpy(dest, src, to_read);
45 dest[i] =
static_cast<uint8_t
>(
ReadBits(8));
53 const size_t capacity = size_ * 8 - bit_offset_;
54 const size_t to_read = std::min(count, capacity);
55 const size_t to_read_bytes = (bit_offset_ + to_read) / 8;
56 DCHECK_LE(to_read_bytes, size_);
57 data_ += to_read_bytes;
58 size_ -= to_read_bytes;
59 bit_offset_ = (bit_offset_ + to_read) % 8;
65 DCHECK(endianness ==
kBigEndian || (bit_offset_ == 0 && count % 8 == 0));
68 for (
size_t i = 0; i < count && size_ > 0;) {
75 const size_t bits_remain = 8 - bit_offset_;
76 const size_t to_read = std::min(count - i, bits_remain);
77 const size_t shift = bits_remain - to_read;
78 const size_t mask = ((1 << to_read) - 1);
79 const uint8_t part = (data_[0] >> shift) & mask;
81 ret |= part << (count - i - to_read);
85 if (bit_offset_ + to_read == 8) {
90 DCHECK_LT(bit_offset_ + to_read, 8);
91 bit_offset_ += to_read;
104 return (1 << count) - 1 +
ReadBits(count);
size_t Skip(size_t count)
size_t SkipBits(size_t count)
uint64_t ReadBits(size_t count, Endianness endianness=kBigEndian)
const uint8_t * data() const
void SetBuffer(const uint8_t *data, size_t data_size)
size_t Read(uint8_t *dest, size_t dest_size)