root/trunk/Updater/ICSharpCode.SharpZipLib/Checksums/StrangeCRC.cs @ 597

Wersja 597, 7.5 KB (wprowadzona przez marek, 17 years temu)

re #165

Line 
1// StrangeCRC.cs - computes a crc used in the bziplib
2//
3// Copyright (C) 2001 Mike Krueger
4//
5// This file was translated from java, it was part of the GNU Classpath
6// Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
7//
8// This program is free software; you can redistribute it and/or
9// modify it under the terms of the GNU General Public License
10// as published by the Free Software Foundation; either version 2
11// of the License, or (at your option) any later version.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21//
22// Linking this library statically or dynamically with other modules is
23// making a combined work based on this library.  Thus, the terms and
24// conditions of the GNU General Public License cover the whole
25// combination.
26//
27// As a special exception, the copyright holders of this library give you
28// permission to link this library with independent modules to produce an
29// executable, regardless of the license terms of these independent
30// modules, and to copy and distribute the resulting executable under
31// terms of your choice, provided that you also meet, for each linked
32// independent module, the terms and conditions of the license of that
33// module.  An independent module is a module which is not derived from
34// or based on this library.  If you modify this library, you may extend
35// this exception to your version of the library, but you are not
36// obligated to do so.  If you do not wish to do so, delete this
37// exception statement from your version.
38
39using System;
40
41namespace ICSharpCode.SharpZipLib.Checksums
42{
43        /// <summary>
44        /// Bzip2 checksum algorithm
45        /// </summary>
46        public class StrangeCRC : IChecksum
47        {
48                readonly static uint[] crc32Table = {
49                        0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
50                        0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
51                        0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
52                        0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
53                        0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
54                        0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
55                        0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
56                        0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
57                        0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
58                        0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
59                        0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
60                        0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
61                        0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
62                        0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
63                        0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
64                        0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
65                        0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
66                        0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
67                        0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
68                        0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
69                        0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
70                        0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
71                        0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
72                        0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
73                        0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
74                        0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
75                        0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
76                        0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
77                        0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
78                        0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
79                        0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
80                        0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
81                        0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
82                        0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
83                        0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
84                        0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
85                        0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
86                        0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
87                        0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
88                        0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
89                        0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
90                        0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
91                        0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
92                        0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
93                        0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
94                        0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
95                        0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
96                        0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
97                        0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
98                        0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
99                        0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
100                        0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
101                        0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
102                        0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
103                        0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
104                        0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
105                        0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
106                        0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
107                        0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
108                        0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
109                        0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
110                        0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
111                        0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
112                        0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
113                };
114               
115                int globalCrc;
116
117                /// <summary>
118                /// Initialise a default instance of <see cref="StrangeCRC"></see>
119                /// </summary> 
120                public StrangeCRC()
121                {
122                        Reset();
123                }
124
125                /// <summary>
126                /// Reset the state of Crc.
127                /// </summary>
128                public void Reset()
129                {
130                        globalCrc = -1;
131                }
132
133                /// <summary>
134                /// Get the current Crc value.
135                /// </summary>
136                public long Value {
137                        get {
138                                return ~globalCrc;
139                        }
140                }
141               
142                /// <summary>
143                /// Update the Crc value.
144                /// </summary>
145                /// <param name="value">data update is based on</param>
146                public void Update(int value)
147                {
148                        int temp = (globalCrc >> 24) ^ value;
149                        if (temp < 0) {
150                                temp = 256 + temp;
151                        }
152                        globalCrc = unchecked((int)((globalCrc << 8) ^ crc32Table[temp]));
153                }
154
155                /// <summary>
156                /// Update Crc based on a block of data
157                /// </summary>
158                /// <param name="buffer">The buffer containing data to update the crc with.</param>
159                public void Update(byte[] buffer)
160                {
161                        if (buffer == null) {
162                                throw new ArgumentNullException("buffer");
163                        }
164                       
165                        Update(buffer, 0, buffer.Length);
166                }
167               
168                /// <summary>
169                /// Update Crc based on a portion of a block of data
170                /// </summary>
171                /// <param name="buffer">block of data</param>
172                /// <param name="offset">index of first byte to use</param>
173                /// <param name="count">number of bytes to use</param>
174                public void Update(byte[] buffer, int offset, int count)
175                {
176                        if (buffer == null) {
177                                throw new ArgumentNullException("buffer");
178                        }
179                       
180                        if ( offset < 0 )
181                        {
182#if NETCF_1_0
183                                throw new ArgumentOutOfRangeException("offset");
184#else
185                                throw new ArgumentOutOfRangeException("offset", "cannot be less than zero");
186#endif                         
187                        }
188
189                        if ( count < 0 )
190                        {
191#if NETCF_1_0
192                                throw new ArgumentOutOfRangeException("count");
193#else
194                                throw new ArgumentOutOfRangeException("count", "cannot be less than zero");
195#endif
196                        }
197
198                        if ( offset + count > buffer.Length )
199                        {
200                                throw new ArgumentOutOfRangeException("count");
201                        }
202                       
203                        for (int i = 0; i < count; ++i) {
204                                Update(buffer[offset++]);
205                        }
206                }
207        }
208}
Notatka: Zobacz TracBrowser aby uzyskać więcej informacji.