Skip to content

Commit 229ff25

Browse files
deciphererpiksel
authored andcommitted
Merge PR #293: Do not calculate Adler checksum if it is not necessary. (#293)
1 parent 7a9b1a2 commit 229ff25

File tree

3 files changed

+47
-17
lines changed

3 files changed

+47
-17
lines changed

src/ICSharpCode.SharpZipLib/Zip/Compression/Deflater.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public Deflater(int level, bool noZlibHeaderOrFooter)
187187
}
188188

189189
pending = new DeflaterPending();
190-
engine = new DeflaterEngine(pending);
190+
engine = new DeflaterEngine(pending, noZlibHeaderOrFooter);
191191
this.noZlibHeaderOrFooter = noZlibHeaderOrFooter;
192192
SetStrategy(DeflateStrategy.Default);
193193
SetLevel(level);

src/ICSharpCode.SharpZipLib/Zip/Compression/DeflaterEngine.cs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,33 @@ public class DeflaterEngine
5656

5757
/// <summary>
5858
/// Construct instance with pending buffer
59+
/// Adler calculation will be peformed
5960
/// </summary>
6061
/// <param name="pending">
6162
/// Pending buffer to use
62-
/// </param>>
63+
/// </param>
6364
public DeflaterEngine(DeflaterPending pending)
65+
: this (pending, false)
66+
{
67+
}
68+
69+
70+
71+
/// <summary>
72+
/// Construct instance with pending buffer
73+
/// </summary>
74+
/// <param name="pending">
75+
/// Pending buffer to use
76+
/// </param>
77+
/// <param name="noAdlerCalculation">
78+
/// If no adler calculation should be performed
79+
/// </param>
80+
public DeflaterEngine(DeflaterPending pending, bool noAdlerCalculation)
6481
{
6582
this.pending = pending;
6683
huffman = new DeflaterHuffman(pending);
67-
adler = new Adler32();
84+
if (!noAdlerCalculation)
85+
adler = new Adler32();
6886

6987
window = new byte[2 * DeflaterConstants.WSIZE];
7088
head = new short[DeflaterConstants.HASH_SIZE];
@@ -185,7 +203,7 @@ public void SetDictionary(byte[] buffer, int offset, int length)
185203
throw new InvalidOperationException("strstart not 1");
186204
}
187205
#endif
188-
adler.Update(new ArraySegment<byte>(buffer, offset, length));
206+
adler?.Update(new ArraySegment<byte>(buffer, offset, length));
189207
if (length < DeflaterConstants.MIN_MATCH)
190208
{
191209
return;
@@ -216,7 +234,7 @@ public void SetDictionary(byte[] buffer, int offset, int length)
216234
public void Reset()
217235
{
218236
huffman.Reset();
219-
adler.Reset();
237+
adler?.Reset();
220238
blockStart = strstart = 1;
221239
lookahead = 0;
222240
totalIn = 0;
@@ -239,7 +257,7 @@ public void Reset()
239257
/// </summary>
240258
public void ResetAdler()
241259
{
242-
adler.Reset();
260+
adler?.Reset();
243261
}
244262

245263
/// <summary>
@@ -249,7 +267,7 @@ public int Adler
249267
{
250268
get
251269
{
252-
return unchecked((int)adler.Value);
270+
return (adler != null) ? unchecked((int)adler.Value) : 0;
253271
}
254272
}
255273

@@ -368,7 +386,7 @@ public void FillWindow()
368386
}
369387

370388
System.Array.Copy(inputBuf, inputOff, window, strstart + lookahead, more);
371-
adler.Update(new ArraySegment<byte>(inputBuf, inputOff, more));
389+
adler?.Update(new ArraySegment<byte>(inputBuf, inputOff, more));
372390

373391
inputOff += more;
374392
totalIn += more;

src/ICSharpCode.SharpZipLib/Zip/Compression/Inflater.cs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ public Inflater() : this(false)
172172
public Inflater(bool noHeader)
173173
{
174174
this.noHeader = noHeader;
175-
this.adler = new Adler32();
175+
if (!noHeader)
176+
this.adler = new Adler32();
176177
input = new StreamManipulator();
177178
outputWindow = new OutputWindow();
178179
mode = noHeader ? DECODE_BLOCKS : DECODE_HEADER;
@@ -195,7 +196,7 @@ public void Reset()
195196
litlenTree = null;
196197
distTree = null;
197198
isLastBlock = false;
198-
adler.Reset();
199+
adler?.Reset();
199200
}
200201

201202
/// <summary>
@@ -407,9 +408,9 @@ private bool DecodeChksum()
407408
neededBits -= 8;
408409
}
409410

410-
if ((int)adler.Value != readAdler)
411+
if ((int)adler?.Value != readAdler)
411412
{
412-
throw new SharpZipBaseException("Adler chksum doesn't match: " + (int)adler.Value + " vs. " + readAdler);
413+
throw new SharpZipBaseException("Adler chksum doesn't match: " + (int)adler?.Value + " vs. " + readAdler);
413414
}
414415

415416
mode = FINISHED;
@@ -607,13 +608,13 @@ public void SetDictionary(byte[] buffer, int index, int count)
607608
throw new InvalidOperationException("Dictionary is not needed");
608609
}
609610

610-
adler.Update(new ArraySegment<byte>(buffer, index, count));
611+
adler?.Update(new ArraySegment<byte>(buffer, index, count));
611612

612-
if ((int)adler.Value != readAdler)
613+
if (adler != null && (int)adler.Value != readAdler)
613614
{
614615
throw new SharpZipBaseException("Wrong adler checksum");
615616
}
616-
adler.Reset();
617+
adler?.Reset();
617618
outputWindow.CopyDict(buffer, index, count);
618619
mode = DECODE_BLOCKS;
619620
}
@@ -759,7 +760,7 @@ public int Inflate(byte[] buffer, int offset, int count)
759760
int more = outputWindow.CopyOutput(buffer, offset, count);
760761
if (more > 0)
761762
{
762-
adler.Update(new ArraySegment<byte>(buffer, offset, more));
763+
adler?.Update(new ArraySegment<byte>(buffer, offset, more));
763764
offset += more;
764765
bytesCopied += more;
765766
totalOut += (long)more;
@@ -823,7 +824,18 @@ public int Adler
823824
{
824825
get
825826
{
826-
return IsNeedingDictionary ? readAdler : (int)adler.Value;
827+
if (IsNeedingDictionary)
828+
{
829+
return readAdler;
830+
}
831+
else if (adler != null)
832+
{
833+
return (int)adler.Value;
834+
}
835+
else
836+
{
837+
return 0;
838+
}
827839
}
828840
}
829841

0 commit comments

Comments
 (0)