ccitt: set bitReader default order to MSB
Change-Id: I6d5070006e1a2069ce843e640d2c91c6474a352d
Reviewed-on: https://go-review.googlesource.com/c/image/+/194417
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
Run-TryBot: Benny Siegert <bsiegert@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/ccitt/reader.go b/ccitt/reader.go
index df14833..66a928c 100644
--- a/ccitt/reader.go
+++ b/ccitt/reader.go
@@ -134,7 +134,7 @@
// order is whether to process r's bytes LSB first or MSB first.
order Order
- // The low nBits bits of the bits field hold upcoming bits in LSB order.
+ // The high nBits bits of the bits field hold upcoming bits in MSB order.
bits uint64
nBits uint32
@@ -146,7 +146,7 @@
func (b *bitReader) alignToByteBoundary() {
n := b.nBits & 7
- b.bits >>= n
+ b.bits <<= n
b.nBits -= n
}
@@ -161,10 +161,10 @@
func (b *bitReader) nextBit() (uint32, error) {
for {
if b.nBits > 0 {
- bit := uint32(b.bits) & 1
- b.bits >>= 1
+ bit := (b.bits >> 63) & 1
+ b.bits <<= 1
b.nBits--
- return bit, nil
+ return uint32(bit), nil
}
if available := b.bw - b.br; available >= 4 {
@@ -174,12 +174,12 @@
// checks that the generated maxCodeLength constant fits.
//
// If changing the Uint32 call, also change nextBitMaxNBits.
- b.bits = uint64(binary.LittleEndian.Uint32(b.bytes[b.br:]))
+ b.bits = uint64(binary.BigEndian.Uint32(b.bytes[b.br:])) << 32
b.br += 4
b.nBits = 32
continue
} else if available > 0 {
- b.bits = uint64(b.bytes[b.br])
+ b.bits = uint64(b.bytes[b.br]) << (7 * 8)
b.br++
b.nBits = 8
continue
@@ -194,20 +194,20 @@
b.bw = uint32(n)
b.readErr = err
- if b.order != LSB {
+ if b.order != MSB {
reverseBitsWithinBytes(b.bytes[:b.bw])
}
}
}
func decode(b *bitReader, decodeTable [][2]int16) (uint32, error) {
- nBitsRead, bitsRead, state := uint32(0), uint32(0), int32(1)
+ nBitsRead, bitsRead, state := uint32(0), uint64(0), int32(1)
for {
bit, err := b.nextBit()
if err != nil {
return 0, err
}
- bitsRead |= bit << nBitsRead
+ bitsRead |= uint64(bit) << (63 - nBitsRead)
nBitsRead++
// The "&1" is redundant, but can eliminate a bounds check.
state = int32(decodeTable[state][bit&1])
@@ -215,7 +215,7 @@
return uint32(^state), nil
} else if state == 0 {
// Unread the bits we've read, then return errInvalidCode.
- b.bits = (b.bits << nBitsRead) | uint64(bitsRead)
+ b.bits = (b.bits >> nBitsRead) | bitsRead
b.nBits += nBitsRead
return 0, errInvalidCode
}
diff --git a/ccitt/reader_test.go b/ccitt/reader_test.go
index 01fcff0..21ee5eb 100644
--- a/ccitt/reader_test.go
+++ b/ccitt/reader_test.go
@@ -164,7 +164,7 @@
// Build the encoded form of those values in LSB order.
enc := []byte(nil)
bits := uint8(0)
- nBits := uint32(0)
+ nBits := uint8(7)
for _, v := range values {
code := m[v]
if code == "" {
@@ -172,22 +172,24 @@
}
for _, c := range code {
bits |= uint8(c&1) << nBits
- nBits++
- if nBits == 8 {
+ if nBits == 0 {
enc = append(enc, bits)
bits = 0
- nBits = 0
+ nBits = 7
+ continue
}
+ nBits--
}
}
- if nBits > 0 {
+ if nBits < 7 {
enc = append(enc, bits)
}
// Decode that encoded form.
got := []uint32(nil)
r := &bitReader{
- r: bytes.NewReader(enc),
+ r: bytes.NewReader(enc),
+ order: MSB,
}
finalValue := values[len(values)-1]
for {