Skip to content

Commit 2cc688b

Browse files
committed
Extract ComputeAdler32Checksum method.
1 parent 33ba407 commit 2cc688b

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

src/MySqlConnector/Protocol/Serialization/CompressedPayloadHandler.cs

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -141,19 +141,12 @@ private ValueTask<ArraySegment<byte>> ReadBytesAsync(int count, ProtocolErrorBeh
141141
var bytesRead = decompressingStream.Read(uncompressedData, 0, uncompressedLength);
142142
m_remainingData = new ArraySegment<byte>(uncompressedData, 0, bytesRead);
143143

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);
152145
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))
157150
{
158151
return protocolErrorBehavior == ProtocolErrorBehavior.Ignore ?
159152
default(ValueTask<ArraySegment<byte>>) :
@@ -192,19 +185,12 @@ private ValueTask<int> CompressAndWrite(ArraySegment<byte> remainingUncompressed
192185
using (var deflateStream = new DeflateStream(compressedStream, CompressionLevel.Optimal, leaveOpen: true))
193186
deflateStream.Write(remainingUncompressedData.Array, remainingUncompressedData.Offset, remainingUncompressedBytes);
194187

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-
203188
// 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));
208194

209195
if (!compressedStream.TryGetBuffer(out compressedData))
210196
throw new InvalidOperationException("Couldn't get compressed stream buffer.");
@@ -231,6 +217,17 @@ private ValueTask<int> CompressAndWrite(ArraySegment<byte> remainingUncompressed
231217
CompressAndWrite(remainingUncompressedData, ioBehavior));
232218
}
233219

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+
234231
// CompressedByteHandler implements IByteHandler and delegates reading bytes back to the CompressedPayloadHandler class.
235232
private class CompressedByteHandler : IByteHandler
236233
{

0 commit comments

Comments
 (0)