OSDN Git Service

Add new source files
[armadillo/armadillo1.git] / src / jp / sfjp / armadillo / archive / lzh / LzhChecksum.java
1 package jp.sfjp.armadillo.archive.lzh;
2
3 import java.util.zip.*;
4
5 /**
6  * Checksum(CRC16) for LZH.
7  */
8 public final class LzhChecksum implements Checksum {
9
10     private final int[] table;
11     private final int initial;
12
13     private int value;
14
15     public LzhChecksum() {
16         this(0xA001, 0);
17     }
18
19     LzhChecksum(int exp, int initial) {
20         this.table = create(exp);
21         this.initial = initial;
22         this.value = initial;
23     }
24
25     /**
26      * Creates table.
27      * @param exp
28      * @return 
29      */
30     static int[] create(int exp) {
31         int[] table = new int[256];
32         for (int i = 0; i < table.length; i++) {
33             table[i] = i;
34             for (int j = 0; j < 8; j++) {
35                 if ((table[i] & 0x01) != 0) {
36                     table[i] = (table[i] >> 1) ^ exp;
37                 }
38                 else {
39                     table[i] >>= 1;
40                 }
41             }
42         }
43         return table;
44     }
45
46     public short getShortValue() {
47         return (short)(value & 0xFFFF);
48     }
49
50     @Override
51     public long getValue() {
52         return value;
53     }
54
55     @Override
56     public void reset() {
57         value = initial;
58     }
59
60     @Override
61     public void update(int b) {
62         int value = this.value;
63         value = (value >> 8) ^ table[(value ^ b) & 0xFF];
64         this.value = value;
65     }
66
67     @Override
68     public void update(byte[] bytes, int offset, int length) {
69         int value = this.value;
70         for (int i = offset; i < offset + length; i++) {
71             value = (value >> 8) ^ table[(value ^ bytes[i]) & 0xFF];
72         }
73         this.value = value;
74     }
75
76 }