api/core/src/ms/numpress/IntDecoder.java

Code
Comments
Other
Rev Date Author Line
4520 10 Sep 13 fredrik 1 /*
4520 10 Sep 13 fredrik 2   IntDecoder.java
4520 10 Sep 13 fredrik 3   johan.teleman@immun.lth.se
4520 10 Sep 13 fredrik 4  
4520 10 Sep 13 fredrik 5   Copyright 2013 Johan Teleman
4520 10 Sep 13 fredrik 6
4520 10 Sep 13 fredrik 7    Licensed under the Apache License, Version 2.0 (the "License");
4520 10 Sep 13 fredrik 8    you may not use this file except in compliance with the License.
4520 10 Sep 13 fredrik 9    You may obtain a copy of the License at
4520 10 Sep 13 fredrik 10
4520 10 Sep 13 fredrik 11        http://www.apache.org/licenses/LICENSE-2.0
4520 10 Sep 13 fredrik 12
4520 10 Sep 13 fredrik 13    Unless required by applicable law or agreed to in writing, software
4520 10 Sep 13 fredrik 14    distributed under the License is distributed on an "AS IS" BASIS,
4520 10 Sep 13 fredrik 15    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4520 10 Sep 13 fredrik 16    See the License for the specific language governing permissions and
4520 10 Sep 13 fredrik 17    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 22  * 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 52       // 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 }