OSDN Git Service

Add new source files
[armadillo/armadillo1.git] / src / jp / sfjp / armadillo / archive / cab / CabChecksum.java
1 package jp.sfjp.armadillo.archive.cab;
2
3 import java.util.zip.*;
4
5 /**
6  * Checksum for Cab file.
7  * @see <a href="http://msdn.microsoft.com/en-us/library/bb267310.aspx">
8  *      Microsoft Cabinet Format (http://msdn.microsoft.com/en-us/library/bb267310.aspx)</a>
9  */
10 public final class CabChecksum implements Checksum {
11
12     private final int seed;
13
14     private int value;
15     private int p;
16     private int tmp;
17
18     public CabChecksum() {
19         this(0);
20     }
21
22     public CabChecksum(int seed) {
23         this.seed = seed;
24         reset();
25     }
26
27     @Override
28     public void update(int b) {
29         switch (++p % 4) {
30             case 0:
31                 tmp = b;
32                 break;
33             case 1:
34                 tmp |= b << 8;
35                 break;
36             case 2:
37                 tmp |= b << 16;
38                 break;
39             case 3:
40                 tmp |= b << 24;
41                 value ^= tmp;
42                 tmp = 0;
43                 break;
44             default:
45         }
46     }
47
48     @Override
49     public void update(byte[] b, int off, int len) {
50         for (int i = off; i < len; i++)
51             update(b[i] & 0xFF);
52     }
53
54     @Override
55     public long getValue() {
56         final int tmpValue;
57         final int mod = (p + 1) % 4;
58         if (mod == 0)
59             tmpValue = value;
60         else {
61             int x = 0;
62             switch (mod) {
63                 case 3:
64                     x |= (tmp << 16) & 0xFF0000;
65                     x |= tmp & 0x00FF00;
66                     x |= (tmp >> 16) & 0x0000FF;
67                     assert x == (x & 0xFFFFFF);
68                     break;
69                 case 2:
70                     x |= (tmp << 8) & 0xFF00;
71                     x |= (tmp >> 8) & 0x00FF;
72                     assert x == (x & 0xFFFF);
73                     break;
74                 case 1:
75                     x = tmp;
76                     assert x == (x & 0xFF);
77                     break;
78                 default:
79                     break;
80             }
81             tmpValue = value ^ x;
82         }
83         assert tmpValue == (tmpValue & 0xFFFFFFFF);
84         return tmpValue;
85     }
86
87     @Override
88     public void reset() {
89         value = seed;
90         p = -1;
91     }
92
93 }