root/as3/Marilena/trunk/src/deng/utils/ChecksumUtil.as

リビジョン 567, 2.1 kB (コミッタ: mash, コミット時期: 5 年 前)

[Marilena]initial import of Marilena, Object Detection in AS3

Line 
1 package deng.utils
2 {
3         import flash.utils.ByteArray;
4        
5         public class ChecksumUtil
6         {
7                 /**
8                  * @private
9                  */             
10                 private static var crcTable:Array = makeCRCTable();
11                
12                 /**
13                  * @private
14                  */             
15                 private static function makeCRCTable():Array {
16                         var table:Array = [];
17                         var i:uint;
18                         var j:uint;
19                         var c:uint;
20                         for (i = 0; i < 256; i++) {
21                                 c = i;
22                                 for (j = 0; j < 8; j++) {
23                                         if (c & 1) {
24                                                 c = 0xEDB88320 ^ (c >>> 1);
25                                         } else {
26                                                 c >>>= 1;
27                                         }
28                                 }
29                                 table.push(c);
30                         }
31                         return table;
32                 }
33                
34                 /**
35                  * Calculates a CRC-32 checksum over a ByteArray
36                  *
37                  * @see http://www.w3.org/TR/PNG/#D-CRCAppendix
38                  *
39                  * @param data
40                  * @param len
41                  * @param start
42                  * @return CRC-32 checksum
43                  */             
44                 public static function CRC32(data:ByteArray, start:uint = 0, len:uint = 0):uint {
45                         if (start >= data.length) { start = data.length; }
46                         if (len == 0) { len = data.length - start; }
47                         if (len + start > data.length) { len = data.length - start; }
48                         var i:uint;
49                         var c:uint = 0xffffffff;
50                         for (i = start; i < len; i++) {
51                                 c = uint(crcTable[(c ^ data[i]) & 0xff]) ^ (c >>> 8);
52                         }
53                         return (c ^ 0xffffffff);
54                 }
55                
56                 /**
57                  * Calculates an Adler-32 checksum over a ByteArray
58                  *
59                  * @see http://en.wikipedia.org/wiki/Adler-32#Example_implementation
60                  *
61                  * @param data
62                  * @param len
63                  * @param start
64                  * @return Adler-32 checksum
65                  */             
66                 public static function Adler32(data:ByteArray, start:uint = 0, len:uint = 0):uint {
67                         if (start >= data.length) { start = data.length; }
68                         if (len == 0) { len = data.length - start; }
69                         if (len + start > data.length) { len = data.length - start; }
70                         var i:uint = start;
71                         var a:uint = 1;
72                         var b:uint = 0;
73                         while (len) {
74                                 var tlen:uint = (len > 5550) ? 5550 : len;
75                                 len -= tlen;
76                                 do {
77                                         a += data[i++];
78                                         b += a;
79                                 } while (--tlen);
80                                 a = (a & 0xffff) + (a >> 16) * 15;
81                                 b = (b & 0xffff) + (b >> 16) * 15;
82                         }
83                         if (a >= 65521) { a -= 65521; }
84                         b = (b & 0xffff) + (b >> 16) * 15;
85                         if (b >= 65521) { b -= 65521; }
86                         return (b << 16) | a;
87                 }
88         }
89 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。