4520 |
10 Sep 13 |
fredrik |
1 |
/* |
4520 |
10 Sep 13 |
fredrik |
IntDecoder.java |
4520 |
10 Sep 13 |
fredrik |
johan.teleman@immun.lth.se |
4520 |
10 Sep 13 |
fredrik |
4 |
|
4520 |
10 Sep 13 |
fredrik |
Copyright 2013 Johan Teleman |
4520 |
10 Sep 13 |
fredrik |
6 |
|
4520 |
10 Sep 13 |
fredrik |
Licensed under the Apache License, Version 2.0 (the "License"); |
4520 |
10 Sep 13 |
fredrik |
you may not use this file except in compliance with the License. |
4520 |
10 Sep 13 |
fredrik |
You may obtain a copy of the License at |
4520 |
10 Sep 13 |
fredrik |
10 |
|
4520 |
10 Sep 13 |
fredrik |
http://www.apache.org/licenses/LICENSE-2.0 |
4520 |
10 Sep 13 |
fredrik |
12 |
|
4520 |
10 Sep 13 |
fredrik |
Unless required by applicable law or agreed to in writing, software |
4520 |
10 Sep 13 |
fredrik |
distributed under the License is distributed on an "AS IS" BASIS, |
4520 |
10 Sep 13 |
fredrik |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
4520 |
10 Sep 13 |
fredrik |
See the License for the specific language governing permissions and |
4520 |
10 Sep 13 |
fredrik |
limitations under the License. |
4520 |
10 Sep 13 |
fredrik |
18 |
*/ |
4520 |
10 Sep 13 |
fredrik |
19 |
package ms.numpress; |
4520 |
10 Sep 13 |
fredrik |
20 |
|
4520 |
10 Sep 13 |
fredrik |
21 |
/** |
4520 |
10 Sep 13 |
fredrik |
* Decodes ints from the half bytes in bytes. Lossless reverse of encodeInt |
4520 |
10 Sep 13 |
fredrik |
23 |
*/ |
4520 |
10 Sep 13 |
fredrik |
24 |
class IntDecoder { |
4520 |
10 Sep 13 |
fredrik |
25 |
|
4520 |
10 Sep 13 |
fredrik |
26 |
int pos = 0; |
4520 |
10 Sep 13 |
fredrik |
27 |
boolean half = false; |
4520 |
10 Sep 13 |
fredrik |
28 |
byte[] bytes; |
4520 |
10 Sep 13 |
fredrik |
29 |
|
4520 |
10 Sep 13 |
fredrik |
30 |
public IntDecoder(byte[] _bytes, int _pos) { |
4520 |
10 Sep 13 |
fredrik |
31 |
bytes = _bytes; |
4520 |
10 Sep 13 |
fredrik |
32 |
pos = _pos; |
4520 |
10 Sep 13 |
fredrik |
33 |
} |
4520 |
10 Sep 13 |
fredrik |
34 |
|
4520 |
10 Sep 13 |
fredrik |
35 |
public long next() { |
4520 |
10 Sep 13 |
fredrik |
36 |
int head; |
4520 |
10 Sep 13 |
fredrik |
37 |
int i, n; |
4520 |
10 Sep 13 |
fredrik |
38 |
long res = 0; |
4520 |
10 Sep 13 |
fredrik |
39 |
long mask, m; |
4520 |
10 Sep 13 |
fredrik |
40 |
int hb; |
4520 |
10 Sep 13 |
fredrik |
41 |
|
4520 |
10 Sep 13 |
fredrik |
42 |
if (!half) |
4520 |
10 Sep 13 |
fredrik |
43 |
head = (0xff & bytes[pos]) >> 4; |
4520 |
10 Sep 13 |
fredrik |
44 |
else |
4520 |
10 Sep 13 |
fredrik |
45 |
head = 0xf & bytes[pos++]; |
4520 |
10 Sep 13 |
fredrik |
46 |
|
4520 |
10 Sep 13 |
fredrik |
47 |
half = !half; |
4520 |
10 Sep 13 |
fredrik |
48 |
|
4520 |
10 Sep 13 |
fredrik |
49 |
if (head <= 8) |
4520 |
10 Sep 13 |
fredrik |
50 |
n = head; |
4520 |
10 Sep 13 |
fredrik |
51 |
else { |
4520 |
10 Sep 13 |
fredrik |
// leading ones, fill in res |
4520 |
10 Sep 13 |
fredrik |
53 |
n = head - 8; |
4520 |
10 Sep 13 |
fredrik |
54 |
mask = 0xf0000000; |
4520 |
10 Sep 13 |
fredrik |
55 |
for (i=0; i<n; i++) { |
4520 |
10 Sep 13 |
fredrik |
56 |
m = mask >> (4*i); |
4520 |
10 Sep 13 |
fredrik |
57 |
res = res | m; |
4520 |
10 Sep 13 |
fredrik |
58 |
} |
4520 |
10 Sep 13 |
fredrik |
59 |
} |
4520 |
10 Sep 13 |
fredrik |
60 |
|
4520 |
10 Sep 13 |
fredrik |
61 |
if (n == 8) return 0; |
4520 |
10 Sep 13 |
fredrik |
62 |
|
4520 |
10 Sep 13 |
fredrik |
63 |
for (i=n; i<8; i++) { |
4520 |
10 Sep 13 |
fredrik |
64 |
if (!half) |
4520 |
10 Sep 13 |
fredrik |
65 |
hb = (0xff & bytes[pos]) >> 4; |
4520 |
10 Sep 13 |
fredrik |
66 |
else |
4520 |
10 Sep 13 |
fredrik |
67 |
hb = 0xf & bytes[pos++]; |
4520 |
10 Sep 13 |
fredrik |
68 |
|
4520 |
10 Sep 13 |
fredrik |
69 |
res = res | (hb << ((i-n)*4)); |
4520 |
10 Sep 13 |
fredrik |
70 |
half = !half; |
4520 |
10 Sep 13 |
fredrik |
71 |
} |
4520 |
10 Sep 13 |
fredrik |
72 |
|
4520 |
10 Sep 13 |
fredrik |
73 |
return res; |
4520 |
10 Sep 13 |
fredrik |
74 |
} |
4520 |
10 Sep 13 |
fredrik |
75 |
} |