Skip to content

Commit 123714b

Browse files
authored
Fix decompression
1 parent 5b02e9f commit 123714b

File tree

1 file changed

+30
-87
lines changed

1 file changed

+30
-87
lines changed

decompress.go

Lines changed: 30 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -32,107 +32,50 @@ func Decompress(passed []byte) ([]byte, error) {
3232
decompressed = new(bytes.Buffer)
3333

3434
for decompressed.Len() < int(originalLen) {
35-
currentByte, err := compressed.ReadByte()
36-
if err != nil {
37-
return nil, ErrTruncated
38-
}
39-
40-
for _, flag := range bits(currentByte) {
41-
if flag == 0 {
42-
// Copy a byte as-is.
43-
nextByte, err := compressed.ReadByte()
44-
if err != nil {
45-
return nil, err
46-
}
35+
read := compressed.Next(1)[0]
4736

48-
err = decompressed.WriteByte(nextByte)
49-
if err != nil {
50-
return nil, err
51-
}
52-
} else if flag == 1 {
53-
// Determine how many times to copy a byte.
54-
nextByte, err := compressed.ReadByte()
55-
if err != nil {
56-
return nil, err
57-
}
37+
for i := 7; i != -1; i-- {
38+
if decompressed.Len() >= int(originalLen) {
39+
break
40+
}
5841

59-
indicator := nextByte >> 4
60-
var count int
61-
if indicator == 0 {
62-
// 8 bit count, 12 bit disp
63-
count = int(nextByte << 4)
42+
if (read >> i) & 1 == 0 {
43+
decompressed.WriteByte(compressed.Next(1)[0])
44+
} else {
45+
lenmsb := uint32(compressed.Next(1)[0])
46+
lsb := uint32(compressed.Next(1)[0])
6447

65-
// Read a further byte for full displacement.
66-
nextByte, err = compressed.ReadByte()
67-
if err != nil {
68-
return nil, err
69-
}
48+
length := lenmsb >> 4
49+
disp := ((lenmsb & 15) << 8) + lsb
7050

71-
count += int(nextByte) >> 4
72-
count += 0x11
73-
} else if indicator == 1 {
74-
// 16 bit count, 12 bit disp
75-
count = int((nextByte & 0xf) << 12)
76-
nextByte, err = compressed.ReadByte()
77-
if err != nil {
78-
return nil, err
79-
}
80-
count += int(nextByte << 4)
51+
if length > 1 {
52+
length += 1
53+
} else if length == 0 {
54+
length = (lenmsb & 15) << 4
55+
length += lsb >> 4
56+
length += 0x11
57+
msb := uint32(compressed.Next(1)[0])
58+
disp = ((lsb & 15) << 8) + msb
8159

82-
nextByte, err = compressed.ReadByte()
83-
if err != nil {
84-
return nil, err
85-
}
86-
count += int(nextByte) >> 4
87-
count += 0x111
8860
} else {
89-
// Indicator is count, 12 bit disp
90-
count = int(indicator)
91-
count += 1
92-
}
61+
length = (lenmsb & 15) << 12
62+
length += lsb << 4
63+
someBytes := compressed.Next(2)
64+
length += uint32(someBytes[0]) >> 4
65+
length += 0x111
66+
disp = ((uint32(someBytes[0]) & 15) << 8) + uint32(someBytes[1])
9367

94-
// Determine the offset to copy from within decompressed.
95-
disp := (int(nextByte) & 0xf) << 8
96-
dispByte, err := compressed.ReadByte()
97-
if err != nil {
98-
return nil, err
9968
}
100-
disp += int(dispByte)
101-
disp += 1
10269

103-
// Copy the offset of bytes from the current decompressed buffer for the specified amount.
104-
for count != 0 {
105-
current := decompressed.Bytes()
106-
err = decompressed.WriteByte(current[len(current)-disp])
107-
if err != nil {
108-
return nil, err
109-
}
70+
start := decompressed.Len() - int(disp) - 1
11071

111-
count--
72+
for i1 := 0; i1 < int(length); i1++ {
73+
val := decompressed.Bytes()[start + i1]
74+
decompressed.WriteByte(val)
11275
}
113-
} else {
114-
return nil, ErrInvalidData
115-
}
116-
117-
if int(originalLen) <= decompressed.Len() {
118-
break
11976
}
12077
}
12178
}
12279

12380
return decompressed.Bytes(), nil
12481
}
125-
126-
// bits returns a byte array with the individual bits for a byte.
127-
func bits(passed byte) [8]byte {
128-
return [8]byte{
129-
(passed >> 7) & 1,
130-
(passed >> 6) & 1,
131-
(passed >> 5) & 1,
132-
(passed >> 4) & 1,
133-
(passed >> 3) & 1,
134-
(passed >> 2) & 1,
135-
(passed >> 1) & 1,
136-
passed & 1,
137-
}
138-
}

0 commit comments

Comments
 (0)