Home | History | Annotate | Download | only in Util
      1 /*
      2  * [The "BSD licence"]
      3  * Copyright (c) 2010 Ben Gruver (JesusFreke)
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  * 3. The name of the author may not be used to endorse or promote products
     15  *    derived from this software without specific prior written permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 package org.jf.dexlib.Util;
     30 
     31 public class NumberUtils {
     32 
     33     /**
     34      * Decodes the high signed 4-bit nibble from the given byte
     35      * @param b the byte to decode
     36      * @return the decoded signed nibble
     37      */
     38     public static byte decodeHighSignedNibble(byte b) {
     39         return (byte)(b >> 4);
     40     }
     41 
     42     /**
     43      * Decodes the low signed 4-bit nibble from the given byte
     44      * @param b the byte to decode
     45      * @return the decoded signed nibble
     46      */
     47     public static byte decodeLowSignedNibble(byte b) {
     48         return (byte)(((byte)(b << 4)) >> 4);
     49     }
     50 
     51     /**
     52      * Decodes the high unsigned 4-bit nibble from the given byte
     53      * @param b the byte to decode
     54      * @return the decoded unsigned nibble
     55      */
     56     public static byte decodeHighUnsignedNibble(byte b) {
     57         return (byte)((b & 0xFF) >>> 4);
     58     }
     59 
     60     /**
     61      * Decodes the low unsigned 4-bit nibble from the given byte
     62      * @param b the byte to decode
     63      * @return the decoded unsigned nibble
     64      */
     65     public static byte decodeLowUnsignedNibble(byte b) {
     66         return (byte)(b & 0x0F);
     67     }
     68 
     69     /**
     70      * Decodes an unsigned byte from a signed byte
     71      * @param b the signed byte to decode
     72      * @return the decoded unsigned byte as a short
     73      */
     74     public static short decodeUnsignedByte(byte b) {
     75         return (short)(b & 0xFF);
     76     }
     77 
     78     /**
     79      * Decodes a signed short value from 2 individual bytes
     80      * The parameters are in order from least significant byte to most significant byte
     81      * @param lsb the least significant byte
     82      * @param msb the most significant byte
     83      * @return the decoded signed short value
     84      */
     85     public static short decodeShort(byte lsb, byte msb) {
     86         return (short)
     87                (    (lsb & 0xFF) |
     88                     (msb << 8)
     89                );
     90     }
     91 
     92     /**
     93      * Decodes a signed short value in little endian format from the given byte array at the given index.
     94      * @param bytes the byte array
     95      * @param index the index of the first byte of the signed short value to decode
     96      * @return the decoded signed short value
     97      */
     98     public static short decodeShort(byte[] bytes, int index) {
     99         return (short)
    100                (    (bytes[index++] & 0xFF) |
    101                     (bytes[index] << 8)
    102                );
    103     }
    104 
    105     /**
    106      * Decodes an unsigned short value from 2 individual bytes
    107      * The parameters are in order from least significant byte to most significant byte
    108      * @param lsb the least significant byte
    109      * @param msb the most significant byte
    110      * @return the decoded unsigned short value as an int
    111      */
    112     public static int decodeUnsignedShort(byte lsb, byte msb) {
    113         return  (   (lsb & 0xFF) |
    114                     ((msb & 0xFF) << 8)
    115                 );
    116     }
    117 
    118     /**
    119      * Decodes an unsigned short value in little endian format from the given byte array at the given index.
    120      * @param bytes the byte array
    121      * @param index the index of the first byte of the unsigned short value to decode
    122      * @return the decoded unsigned short value as an int
    123      */
    124     public static int decodeUnsignedShort(byte[] bytes, int index) {
    125         return  (   (bytes[index++] & 0xFF) |
    126                     ((bytes[index] & 0xFF) << 8)
    127                 );
    128     }
    129 
    130     /**
    131      * Decodes a signed integer value from 4 individual bytes
    132      * The parameters are in order from least significant byte to most significant byte
    133      * @param lsb the least significant byte
    134      * @param mlsb the middle least significant byte
    135      * @param mmsb the middle most significant byte
    136      * @param msb the most significant byte
    137      * @return the decoded signed integer value
    138      */
    139     public static int decodeInt(byte lsb, byte mlsb, byte mmsb, byte msb) {
    140         return (lsb & 0xFF) |
    141                ((mlsb & 0xFF) << 8) |
    142                ((mmsb & 0xFF) << 16) |
    143                (msb << 24);
    144     }
    145 
    146     /**
    147      * Decodes a signed integer value in little endian format from the given byte array at the given index.
    148      * @param bytes the byte array
    149      * @param index the index of the first byte of the signed integer value to decode
    150      * @return the decoded signed integer value
    151      */
    152     public static int decodeInt(byte[] bytes, int index) {
    153         return (bytes[index++]  & 0xFF) |
    154                ((bytes[index++] & 0xFF) << 8) |
    155                ((bytes[index++] & 0xFF) << 16) |
    156                (bytes[index] << 24);
    157     }
    158 
    159     /**
    160      * Decodes a signed long value from 8 individual bytes
    161      * The parameters are in order from least significant byte to most significant byte
    162      * @param llsb the lower least significant byte
    163      * @param lmlsb the lower middle least significant byte
    164      * @param lmmsb the lower middle most significant byte
    165      * @param lgsb the lower greater significant byte
    166      * @param glsb the greater least significant byte
    167      * @param gmlsb the greater middle least significant byte
    168      * @param gmmsb the greater middle most significant byte
    169      * @param gmsb the greater most significant byte
    170      * @return the decoded signed long value
    171      */
    172     public static long decodeLong(byte llsb, byte lmlsb, byte lmmsb, byte lgsb, byte glsb, byte gmlsb, byte gmmsb,
    173                                   byte gmsb) {
    174         return  (llsb   & 0xFFL) |
    175                 ((lmlsb & 0xFFL) << 8) |
    176                 ((lmmsb & 0xFFL) << 16) |
    177                 ((lgsb  & 0xFFL) << 24) |
    178                 ((glsb  & 0xFFL) << 32) |
    179                 ((gmlsb & 0xFFL) << 40) |
    180                 ((gmmsb & 0xFFL) << 48) |
    181                 (((long)gmsb) << 56);
    182     }
    183 
    184     /**
    185      * Decodes a signed long value in little endian format from the given byte array at the given index.
    186      * @param bytes the byte array
    187      * @param index the index of the first byte of the signed long value to decode
    188      * @return the decoded signed long value
    189      */
    190     public static long decodeLong(byte[] bytes, int index) {
    191         return  (bytes[index++] & 0xFFL) |
    192                 ((bytes[index++] & 0xFFL) << 8) |
    193                 ((bytes[index++] & 0xFFL) << 16) |
    194                 ((bytes[index++] & 0xFFL) << 24) |
    195                 ((bytes[index++] & 0xFFL) << 32) |
    196                 ((bytes[index++] & 0xFFL) << 40) |
    197                 ((bytes[index++] & 0xFFL) << 48) |
    198                 (((long)bytes[index]) << 56);
    199     }
    200 }
    201