@@ -40,15 +40,16 @@ bool ZRLT::forward(SliceArray<byte>& input, SliceArray<byte>& output, int length
40
40
uint srcIdx = 0 ;
41
41
uint dstIdx = 0 ;
42
42
const uint srcEnd = length;
43
- const uint dstEnd = length; // do not expand
43
+ const uint dstEnd = length - 16 ; // do not expand
44
+ const uint srcEnd4 = length - 4 ;
44
45
bool res = true ;
45
46
byte zeros[4 ] = { byte (0 ) };
46
47
47
48
while (srcIdx < srcEnd) {
48
49
if (src[srcIdx] == byte (0 )) {
49
50
uint runLength = 1 ;
50
51
51
- while ((srcIdx + runLength + 4 < srcEnd ) && (memcmp (&src[srcIdx + runLength], &zeros[0 ], 4 ) == 0 ))
52
+ while ((srcIdx + runLength < srcEnd4 ) && (memcmp (&src[srcIdx + runLength], &zeros[0 ], 4 ) == 0 ))
52
53
runLength += 4 ;
53
54
54
55
while ((srcIdx + runLength < srcEnd) && src[srcIdx + runLength] == byte (0 ))
@@ -58,14 +59,26 @@ bool ZRLT::forward(SliceArray<byte>& input, SliceArray<byte>& output, int length
58
59
59
60
// Encode length
60
61
runLength++;
61
- int log = Global::_log2 (uint32 (runLength));
62
62
63
- if (dstIdx >= dstEnd - log ) {
63
+ if (dstIdx >= dstEnd) {
64
64
res = false ;
65
65
break ;
66
66
}
67
67
68
+ int log = Global::_log2 (uint32 (runLength));
69
+
68
70
// Write every bit as a byte except the most significant one
71
+ while (log > 3 ) {
72
+ log--;
73
+ dst[dstIdx++] = byte ((runLength >> log) & 1 );
74
+ log--;
75
+ dst[dstIdx++] = byte ((runLength >> log) & 1 );
76
+ log--;
77
+ dst[dstIdx++] = byte ((runLength >> log) & 1 );
78
+ log--;
79
+ dst[dstIdx++] = byte ((runLength >> log) & 1 );
80
+ }
81
+
69
82
while (log > 0 ) {
70
83
log--;
71
84
dst[dstIdx++] = byte ((runLength >> log) & 1 );
@@ -74,24 +87,19 @@ bool ZRLT::forward(SliceArray<byte>& input, SliceArray<byte>& output, int length
74
87
continue ;
75
88
}
76
89
90
+ if (dstIdx >= dstEnd) {
91
+ res = false ;
92
+ break ;
93
+ }
94
+
77
95
const int val = int (src[srcIdx]);
78
96
79
97
if (val >= 0xFE ) {
80
- if (dstIdx >= dstEnd - 1 ) {
81
- res = false ;
82
- break ;
83
- }
84
-
85
98
dst[dstIdx] = byte (0xFF );
99
+ dst[dstIdx + 1 ] = byte (val - 0xFE );
86
100
dstIdx++;
87
- dst[dstIdx] = byte (val - 0xFE );
88
101
}
89
102
else {
90
- if (dstIdx >= dstEnd) {
91
- res = false ;
92
- break ;
93
- }
94
-
95
103
dst[dstIdx] = byte (val + 1 );
96
104
}
97
105
0 commit comments