summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/packed_ct_ev_whitelist/bit_stream_reader.cc17
-rw-r--r--components/packed_ct_ev_whitelist/bit_stream_reader.h5
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.