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