diff options
-rw-r--r-- | components/packed_ct_ev_whitelist/bit_stream_reader.cc | 17 | ||||
-rw-r--r-- | components/packed_ct_ev_whitelist/bit_stream_reader.h | 5 |
2 files changed, 20 insertions, 2 deletions
diff --git a/components/packed_ct_ev_whitelist/bit_stream_reader.cc b/components/packed_ct_ev_whitelist/bit_stream_reader.cc index e4f6cc7..94ef009 100644 --- a/components/packed_ct_ev_whitelist/bit_stream_reader.cc +++ b/components/packed_ct_ev_whitelist/bit_stream_reader.cc @@ -34,8 +34,13 @@ bool BitStreamReader::ReadBits(uint8_t num_bits, uint64_t* out) { return false; *out = 0; - for (uint8_t i = 0; i < num_bits; ++i) - (*out) |= (static_cast<uint64_t>(ReadBit()) << (num_bits - (i + 1))); + + for (; num_bits && (current_bit_ != 7); --num_bits) + (*out) |= (static_cast<uint64_t>(ReadBit()) << (num_bits - 1)); + for (; num_bits / 8; num_bits -= 8) + (*out) |= (static_cast<uint64_t>(ReadByte()) << (num_bits - 8)); + for (; num_bits; --num_bits) + (*out) |= (static_cast<uint64_t>(ReadBit()) << (num_bits - 1)); return true; } @@ -61,5 +66,13 @@ uint8_t BitStreamReader::ReadBit() { return res; } +uint8_t BitStreamReader::ReadByte() { + DCHECK_GT(BitsLeft(), 7u); + DCHECK_EQ(current_bit_, 7); + + return source_.data()[current_byte_++]; + +} + } // namespace internal } // namespace packed_ct_ev_whitelist diff --git a/components/packed_ct_ev_whitelist/bit_stream_reader.h b/components/packed_ct_ev_whitelist/bit_stream_reader.h index 45fa5f5..5c95243 100644 --- a/components/packed_ct_ev_whitelist/bit_stream_reader.h +++ b/components/packed_ct_ev_whitelist/bit_stream_reader.h @@ -41,6 +41,11 @@ class BitStreamReader { // LSB. uint8_t ReadBit(); + // Reads a single byte. + // Precondition: The stream must be byte-aligned (current_bit_ == 7) before + // calling this function. + uint8_t ReadByte(); + const base::StringPiece source_; // Index of the byte currently being read from. |