@@ -32,107 +32,50 @@ func Decompress(passed []byte) ([]byte, error) {
32
32
decompressed = new (bytes.Buffer )
33
33
34
34
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 ]
47
36
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
+ }
58
41
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 ] )
64
47
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
70
50
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
81
59
82
- nextByte , err = compressed .ReadByte ()
83
- if err != nil {
84
- return nil , err
85
- }
86
- count += int (nextByte ) >> 4
87
- count += 0x111
88
60
} 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 ])
93
67
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
99
68
}
100
- disp += int (dispByte )
101
- disp += 1
102
69
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
110
71
111
- count --
72
+ for i1 := 0 ; i1 < int (length ); i1 ++ {
73
+ val := decompressed .Bytes ()[start + i1 ]
74
+ decompressed .WriteByte (val )
112
75
}
113
- } else {
114
- return nil , ErrInvalidData
115
- }
116
-
117
- if int (originalLen ) <= decompressed .Len () {
118
- break
119
76
}
120
77
}
121
78
}
122
79
123
80
return decompressed .Bytes (), nil
124
81
}
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