@@ -141,19 +141,12 @@ private ValueTask<ArraySegment<byte>> ReadBytesAsync(int count, ProtocolErrorBeh
141
141
var bytesRead = decompressingStream . Read ( uncompressedData , 0 , uncompressedLength ) ;
142
142
m_remainingData = new ArraySegment < byte > ( uncompressedData , 0 , bytesRead ) ;
143
143
144
- // compute Adler-32 checksum
145
- int s1 = 1 , s2 = 0 ;
146
- for ( int i = 0 ; i < bytesRead ; i ++ )
147
- {
148
- s1 = ( s1 + uncompressedData [ i ] ) % 65521 ;
149
- s2 = ( s2 + s1 ) % 65521 ;
150
- }
151
-
144
+ var checksum = ComputeAdler32Checksum ( uncompressedData , 0 , bytesRead ) ;
152
145
int adlerStartOffset = payloadReadBytes . Offset + payloadReadBytes . Count - 4 ;
153
- if ( payloadReadBytes . Array [ adlerStartOffset + 0 ] != ( ( s2 >> 8 ) & 0xFF ) ||
154
- payloadReadBytes . Array [ adlerStartOffset + 1 ] != ( s2 & 0xFF ) ||
155
- payloadReadBytes . Array [ adlerStartOffset + 2 ] != ( ( s1 >> 8 ) & 0xFF ) ||
156
- payloadReadBytes . Array [ adlerStartOffset + 3 ] != ( s1 & 0xFF ) )
146
+ if ( payloadReadBytes . Array [ adlerStartOffset + 0 ] != ( ( checksum >> 24 ) & 0xFF ) ||
147
+ payloadReadBytes . Array [ adlerStartOffset + 1 ] != ( ( checksum >> 16 ) & 0xFF ) ||
148
+ payloadReadBytes . Array [ adlerStartOffset + 2 ] != ( ( checksum >> 8 ) & 0xFF ) ||
149
+ payloadReadBytes . Array [ adlerStartOffset + 3 ] != ( checksum & 0xFF ) )
157
150
{
158
151
return protocolErrorBehavior == ProtocolErrorBehavior . Ignore ?
159
152
default ( ValueTask < ArraySegment < byte > > ) :
@@ -192,19 +185,12 @@ private ValueTask<int> CompressAndWrite(ArraySegment<byte> remainingUncompressed
192
185
using ( var deflateStream = new DeflateStream ( compressedStream , CompressionLevel . Optimal , leaveOpen : true ) )
193
186
deflateStream . Write ( remainingUncompressedData . Array , remainingUncompressedData . Offset , remainingUncompressedBytes ) ;
194
187
195
- // compute Adler-32 checksum
196
- int s1 = 1 , s2 = 0 ;
197
- for ( int i = 0 ; i < remainingUncompressedBytes ; i ++ )
198
- {
199
- s1 = ( s1 + remainingUncompressedData . Array [ remainingUncompressedData . Offset + i ] ) % 65521 ;
200
- s2 = ( s2 + s1 ) % 65521 ;
201
- }
202
-
203
188
// write Adler-32 checksum to stream
204
- compressedStream . WriteByte ( ( byte ) ( ( s2 >> 8 ) & 0xFF ) ) ;
205
- compressedStream . WriteByte ( ( byte ) ( s2 & 0xFF ) ) ;
206
- compressedStream . WriteByte ( ( byte ) ( ( s1 >> 8 ) & 0xFF ) ) ;
207
- compressedStream . WriteByte ( ( byte ) ( s1 & 0xFF ) ) ;
189
+ var checksum = ComputeAdler32Checksum ( remainingUncompressedData . Array , remainingUncompressedData . Offset , remainingUncompressedBytes ) ;
190
+ compressedStream . WriteByte ( ( byte ) ( ( checksum >> 24 ) & 0xFF ) ) ;
191
+ compressedStream . WriteByte ( ( byte ) ( ( checksum >> 16 ) & 0xFF ) ) ;
192
+ compressedStream . WriteByte ( ( byte ) ( ( checksum >> 8 ) & 0xFF ) ) ;
193
+ compressedStream . WriteByte ( ( byte ) ( checksum & 0xFF ) ) ;
208
194
209
195
if ( ! compressedStream . TryGetBuffer ( out compressedData ) )
210
196
throw new InvalidOperationException ( "Couldn't get compressed stream buffer." ) ;
@@ -231,6 +217,17 @@ private ValueTask<int> CompressAndWrite(ArraySegment<byte> remainingUncompressed
231
217
CompressAndWrite ( remainingUncompressedData , ioBehavior ) ) ;
232
218
}
233
219
220
+ private uint ComputeAdler32Checksum ( byte [ ] data , int offset , int length )
221
+ {
222
+ int s1 = 1 , s2 = 0 ;
223
+ for ( int i = 0 ; i < length ; i ++ )
224
+ {
225
+ s1 = ( s1 + data [ offset + i ] ) % 65521 ;
226
+ s2 = ( s2 + s1 ) % 65521 ;
227
+ }
228
+ return ( ( ( uint ) s2 ) << 16 ) | ( uint ) s1 ;
229
+ }
230
+
234
231
// CompressedByteHandler implements IByteHandler and delegates reading bytes back to the CompressedPayloadHandler class.
235
232
private class CompressedByteHandler : IByteHandler
236
233
{
0 commit comments