From 08fbafb85b54adbbdfb12b06155e6d330fec9bb7 Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 15 Jun 2015 15:41:05 +0200 Subject: fix missing sign extension --- bitreader.cc | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'bitreader.cc') diff --git a/bitreader.cc b/bitreader.cc index dc92223..8b78bb7 100644 --- a/bitreader.cc +++ b/bitreader.cc @@ -18,6 +18,17 @@ #include "bitreader.h" +namespace +{ +inline qint64 signExtend(quint64 x, int n) +{ + if (n < 64 && (x & (1 << (n-1)))) { + x |= -(1LL << n); + } + return x; +} +} + BitReader::BitReader(QIODevice *device) : child(device), buf(0), avail(0) { @@ -38,6 +49,12 @@ quint64 BitReader::readBits(int n) return x; } +qint64 BitReader::readSignedBits(int n) +{ + quint64 x = readBits(n); + return signExtend(x, n); +} + quint64 BitReader::peekBits(int n) { while (n > avail) { @@ -51,6 +68,12 @@ quint64 BitReader::peekBits(int n) return x; } +qint64 BitReader::peekSignedBits(int n) +{ + quint64 x = peekBits(n); + return signExtend(x, n); +} + void BitReader::skipUntilNextByte() { int skip = avail % 8; -- cgit v1.2.3