1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.compress.archivers.zip;
18
19 import static org.apache.commons.compress.archivers.zip.ZipConstants.BYTE_MASK;
20
21 import java.io.Serializable;
22 import java.math.BigInteger;
23
24
25
26
27
28
29
30
31 public final class ZipEightByteInteger implements Serializable {
32 private static final long serialVersionUID = 1L;
33
34 private static final int BYTE_1 = 1;
35 private static final int BYTE_1_MASK = 0xFF00;
36 private static final int BYTE_1_SHIFT = 8;
37
38 private static final int BYTE_2 = 2;
39 private static final int BYTE_2_MASK = 0xFF0000;
40 private static final int BYTE_2_SHIFT = 16;
41
42 private static final int BYTE_3 = 3;
43 private static final long BYTE_3_MASK = 0xFF000000L;
44 private static final int BYTE_3_SHIFT = 24;
45
46 private static final int BYTE_4 = 4;
47 private static final long BYTE_4_MASK = 0xFF00000000L;
48 private static final int BYTE_4_SHIFT = 32;
49
50 private static final int BYTE_5 = 5;
51 private static final long BYTE_5_MASK = 0xFF0000000000L;
52 private static final int BYTE_5_SHIFT = 40;
53
54 private static final int BYTE_6 = 6;
55 private static final long BYTE_6_MASK = 0xFF000000000000L;
56 private static final int BYTE_6_SHIFT = 48;
57
58 private static final int BYTE_7 = 7;
59 private static final long BYTE_7_MASK = 0x7F00000000000000L;
60 private static final int BYTE_7_SHIFT = 56;
61
62 private static final int LEFTMOST_BIT_SHIFT = 63;
63 private static final byte LEFTMOST_BIT = (byte) 0x80;
64
65 public static final ZipEightByteInteger ZERO = new ZipEightByteInteger(0);
66
67
68
69
70
71
72
73 public static byte[] getBytes(final BigInteger value) {
74 final byte[] result = new byte[8];
75 final long val = value.longValue();
76 result[0] = (byte) (val & BYTE_MASK);
77 result[BYTE_1] = (byte) ((val & BYTE_1_MASK) >> BYTE_1_SHIFT);
78 result[BYTE_2] = (byte) ((val & BYTE_2_MASK) >> BYTE_2_SHIFT);
79 result[BYTE_3] = (byte) ((val & BYTE_3_MASK) >> BYTE_3_SHIFT);
80 result[BYTE_4] = (byte) ((val & BYTE_4_MASK) >> BYTE_4_SHIFT);
81 result[BYTE_5] = (byte) ((val & BYTE_5_MASK) >> BYTE_5_SHIFT);
82 result[BYTE_6] = (byte) ((val & BYTE_6_MASK) >> BYTE_6_SHIFT);
83 result[BYTE_7] = (byte) ((val & BYTE_7_MASK) >> BYTE_7_SHIFT);
84 if (value.testBit(LEFTMOST_BIT_SHIFT)) {
85 result[BYTE_7] |= LEFTMOST_BIT;
86 }
87 return result;
88 }
89
90
91
92
93
94
95
96 public static byte[] getBytes(final long value) {
97 return getBytes(BigInteger.valueOf(value));
98 }
99
100
101
102
103
104
105
106 public static long getLongValue(final byte[] bytes) {
107 return getLongValue(bytes, 0);
108 }
109
110
111
112
113
114
115
116
117 public static long getLongValue(final byte[] bytes, final int offset) {
118 return getValue(bytes, offset).longValue();
119 }
120
121
122
123
124
125
126
127 public static BigInteger getValue(final byte[] bytes) {
128 return getValue(bytes, 0);
129 }
130
131
132
133
134
135
136
137
138 public static BigInteger getValue(final byte[] bytes, final int offset) {
139 long value = (long) bytes[offset + BYTE_7] << BYTE_7_SHIFT & BYTE_7_MASK;
140 value += (long) bytes[offset + BYTE_6] << BYTE_6_SHIFT & BYTE_6_MASK;
141 value += (long) bytes[offset + BYTE_5] << BYTE_5_SHIFT & BYTE_5_MASK;
142 value += (long) bytes[offset + BYTE_4] << BYTE_4_SHIFT & BYTE_4_MASK;
143 value += (long) bytes[offset + BYTE_3] << BYTE_3_SHIFT & BYTE_3_MASK;
144 value += (long) bytes[offset + BYTE_2] << BYTE_2_SHIFT & BYTE_2_MASK;
145 value += (long) bytes[offset + BYTE_1] << BYTE_1_SHIFT & BYTE_1_MASK;
146 value += (long) bytes[offset] & BYTE_MASK;
147 final BigInteger val = BigInteger.valueOf(value);
148 return (bytes[offset + BYTE_7] & LEFTMOST_BIT) == LEFTMOST_BIT ? val.setBit(LEFTMOST_BIT_SHIFT) : val;
149 }
150
151 private final BigInteger value;
152
153
154
155
156
157
158 public ZipEightByteInteger(final BigInteger value) {
159 this.value = value;
160 }
161
162
163
164
165
166
167 public ZipEightByteInteger(final byte[] bytes) {
168 this(bytes, 0);
169 }
170
171
172
173
174
175
176
177 public ZipEightByteInteger(final byte[] bytes, final int offset) {
178 value = getValue(bytes, offset);
179 }
180
181
182
183
184
185
186 public ZipEightByteInteger(final long value) {
187 this(BigInteger.valueOf(value));
188 }
189
190
191
192
193
194
195
196 @Override
197 public boolean equals(final Object o) {
198 if (!(o instanceof ZipEightByteInteger)) {
199 return false;
200 }
201 return value.equals(((ZipEightByteInteger) o).getValue());
202 }
203
204
205
206
207
208
209 public byte[] getBytes() {
210 return getBytes(value);
211 }
212
213
214
215
216
217
218 public long getLongValue() {
219 return value.longValue();
220 }
221
222
223
224
225
226
227 public BigInteger getValue() {
228 return value;
229 }
230
231
232
233
234
235
236 @Override
237 public int hashCode() {
238 return value.hashCode();
239 }
240
241 @Override
242 public String toString() {
243 return "ZipEightByteInteger value: " + value;
244 }
245 }