| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 | 
							- //
 
- // © Copyright Henrik Ravn 2004
 
- //
 
- // Use, modification and distribution are subject to the Boost Software License, Version 1.0.
 
- // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
- //
 
- using System;
 
- using System.Runtime.InteropServices;
 
- using System.Text;
 
- namespace DotZLib
 
- {
 
-     #region ChecksumGeneratorBase
 
-     /// <summary>
 
-     /// Implements the common functionality needed for all <see cref="ChecksumGenerator"/>s
 
-     /// </summary>
 
-     /// <example></example>
 
-     public abstract class ChecksumGeneratorBase : ChecksumGenerator
 
-     {
 
-         /// <summary>
 
-         /// The value of the current checksum
 
-         /// </summary>
 
-         protected uint _current;
 
-         /// <summary>
 
-         /// Initializes a new instance of the checksum generator base - the current checksum is
 
-         /// set to zero
 
-         /// </summary>
 
-         public ChecksumGeneratorBase()
 
-         {
 
-             _current = 0;
 
-         }
 
-         /// <summary>
 
-         /// Initializes a new instance of the checksum generator basewith a specified value
 
-         /// </summary>
 
-         /// <param name="initialValue">The value to set the current checksum to</param>
 
-         public ChecksumGeneratorBase(uint initialValue)
 
-         {
 
-             _current = initialValue;
 
-         }
 
-         /// <summary>
 
-         /// Resets the current checksum to zero
 
-         /// </summary>
 
-         public void Reset() { _current = 0; }
 
-         /// <summary>
 
-         /// Gets the current checksum value
 
-         /// </summary>
 
-         public uint Value { get { return _current; } }
 
-         /// <summary>
 
-         /// Updates the current checksum with part of an array of bytes
 
-         /// </summary>
 
-         /// <param name="data">The data to update the checksum with</param>
 
-         /// <param name="offset">Where in <c>data</c> to start updating</param>
 
-         /// <param name="count">The number of bytes from <c>data</c> to use</param>
 
-         /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
 
-         /// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
 
-         /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
 
-         /// <remarks>All the other <c>Update</c> methods are implmeneted in terms of this one.
 
-         /// This is therefore the only method a derived class has to implement</remarks>
 
-         public abstract void Update(byte[] data, int offset, int count);
 
-         /// <summary>
 
-         /// Updates the current checksum with an array of bytes.
 
-         /// </summary>
 
-         /// <param name="data">The data to update the checksum with</param>
 
-         public void Update(byte[] data)
 
-         {
 
-             Update(data, 0, data.Length);
 
-         }
 
-         /// <summary>
 
-         /// Updates the current checksum with the data from a string
 
-         /// </summary>
 
-         /// <param name="data">The string to update the checksum with</param>
 
-         /// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>
 
-         public void Update(string data)
 
-         {
 
- 			Update(Encoding.UTF8.GetBytes(data));
 
-         }
 
-         /// <summary>
 
-         /// Updates the current checksum with the data from a string, using a specific encoding
 
-         /// </summary>
 
-         /// <param name="data">The string to update the checksum with</param>
 
-         /// <param name="encoding">The encoding to use</param>
 
-         public void Update(string data, Encoding encoding)
 
-         {
 
-             Update(encoding.GetBytes(data));
 
-         }
 
-     }
 
-     #endregion
 
-     #region CRC32
 
-     /// <summary>
 
-     /// Implements a CRC32 checksum generator
 
-     /// </summary>
 
-     public sealed class CRC32Checksum : ChecksumGeneratorBase
 
-     {
 
-         #region DLL imports
 
-         [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
 
-         private static extern uint crc32(uint crc, int data, uint length);
 
-         #endregion
 
-         /// <summary>
 
-         /// Initializes a new instance of the CRC32 checksum generator
 
-         /// </summary>
 
-         public CRC32Checksum() : base() {}
 
-         /// <summary>
 
-         /// Initializes a new instance of the CRC32 checksum generator with a specified value
 
-         /// </summary>
 
-         /// <param name="initialValue">The value to set the current checksum to</param>
 
-         public CRC32Checksum(uint initialValue) : base(initialValue) {}
 
-         /// <summary>
 
-         /// Updates the current checksum with part of an array of bytes
 
-         /// </summary>
 
-         /// <param name="data">The data to update the checksum with</param>
 
-         /// <param name="offset">Where in <c>data</c> to start updating</param>
 
-         /// <param name="count">The number of bytes from <c>data</c> to use</param>
 
-         /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
 
-         /// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
 
-         /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
 
-         public override void Update(byte[] data, int offset, int count)
 
-         {
 
-             if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
 
-             if ((offset+count) > data.Length) throw new ArgumentException();
 
-             GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned);
 
-             try
 
-             {
 
-                 _current = crc32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count);
 
-             }
 
-             finally
 
-             {
 
-                 hData.Free();
 
-             }
 
-         }
 
-     }
 
-     #endregion
 
-     #region Adler
 
-     /// <summary>
 
-     /// Implements a checksum generator that computes the Adler checksum on data
 
-     /// </summary>
 
-     public sealed class AdlerChecksum : ChecksumGeneratorBase
 
-     {
 
-         #region DLL imports
 
-         [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
 
-         private static extern uint adler32(uint adler, int data, uint length);
 
-         #endregion
 
-         /// <summary>
 
-         /// Initializes a new instance of the Adler checksum generator
 
-         /// </summary>
 
-         public AdlerChecksum() : base() {}
 
-         /// <summary>
 
-         /// Initializes a new instance of the Adler checksum generator with a specified value
 
-         /// </summary>
 
-         /// <param name="initialValue">The value to set the current checksum to</param>
 
-         public AdlerChecksum(uint initialValue) : base(initialValue) {}
 
-         /// <summary>
 
-         /// Updates the current checksum with part of an array of bytes
 
-         /// </summary>
 
-         /// <param name="data">The data to update the checksum with</param>
 
-         /// <param name="offset">Where in <c>data</c> to start updating</param>
 
-         /// <param name="count">The number of bytes from <c>data</c> to use</param>
 
-         /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
 
-         /// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
 
-         /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
 
-         public override void Update(byte[] data, int offset, int count)
 
-         {
 
-             if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
 
-             if ((offset+count) > data.Length) throw new ArgumentException();
 
-             GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned);
 
-             try
 
-             {
 
-                 _current = adler32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count);
 
-             }
 
-             finally
 
-             {
 
-                 hData.Free();
 
-             }
 
-         }
 
-     }
 
-     #endregion
 
- }
 
 
  |