Home | History | Annotate | Download | only in formats
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package dexfuzz.rawdex.formats;
     18 
     19 /**
     20  * Class consisting of static methods used for common read/write operations
     21  * perfomed in the Format classes.
     22  */
     23 public class RawInsnHelper {
     24   /**
     25    * Read a signed byte from the idx into the raw array.
     26    */
     27   public static long getSignedByteFromByte(byte[] raw, int idx) {
     28     return (long) raw[idx];
     29   }
     30 
     31   /**
     32    * Read an unsigned byte from the idx into the raw array.
     33    */
     34   public static long getUnsignedByteFromByte(byte[] raw, int idx) {
     35     return ((long) raw[idx]) & 0xff;
     36   }
     37 
     38   /**
     39    * Read an unsigned lower 4 bits from the idx into the raw array.
     40    */
     41   public static long getUnsignedLowNibbleFromByte(byte[] raw, int idx) {
     42     return ((long) raw[idx]) & 0xf;
     43   }
     44 
     45   /**
     46    * Read an unsigned higher 4 bits from the idx into the raw array.
     47    */
     48   public static long getUnsignedHighNibbleFromByte(byte[] raw, int idx) {
     49     return (((long) raw[idx]) >> 4) & 0xf;
     50   }
     51 
     52   /**
     53    * Read an unsigned 2 bytes as a short from the idx into the raw array.
     54    */
     55   public static long getUnsignedShortFromTwoBytes(byte[] raw, int idx) {
     56     return (long) ( (((long) raw[idx]) & 0xff)
     57         | ((((long) raw[idx + 1]) & 0xff) << 8));
     58   }
     59 
     60   /**
     61    * Read a signed 2 bytes as a short from the idx into the raw array.
     62    */
     63   public static long getSignedShortFromTwoBytes(byte[] raw, int idx) {
     64     return (long) ( (((long) raw[idx]) & 0xff)
     65         | (((long) raw[idx + 1]) << 8));
     66   }
     67 
     68   /**
     69    * Read an unsigned 4 bytes as an int from the idx into the raw array.
     70    */
     71   public static long getUnsignedIntFromFourBytes(byte[] raw, int idx) {
     72     return (long) ( (((long) raw[idx]) & 0xff)
     73         | ((((long) raw[idx + 1]) & 0xff) << 8)
     74         | ((((long) raw[idx + 2]) & 0xff) << 16)
     75         | ((((long) raw[idx + 3]) & 0xff) << 24) );
     76   }
     77 
     78   /**
     79    * Read a signed 4 bytes as an int from the idx into the raw array.
     80    */
     81   public static long getSignedIntFromFourBytes(byte[] raw, int idx) {
     82     return (long) ( (((long) raw[idx]) & 0xff)
     83         | ((((long) raw[idx + 1]) & 0xff) << 8)
     84         | ((((long) raw[idx + 2]) & 0xff) << 16)
     85         | (((long) raw[idx + 3]) << 24) );
     86   }
     87 
     88   /**
     89    * Read a signed 8 bytes as a long from the idx into the raw array.
     90    */
     91   public static long getSignedLongFromEightBytes(byte[] raw, int idx) {
     92     return (long) ( (((long) raw[idx]) & 0xff)
     93         | ((((long) raw[idx + 1]) & 0xff) << 8)
     94         | ((((long) raw[idx + 2]) & 0xff) << 16)
     95         | ((((long) raw[idx + 3]) & 0xff) << 24)
     96         | ((((long) raw[idx + 4]) & 0xff) << 32)
     97         | ((((long) raw[idx + 5]) & 0xff) << 40)
     98         | ((((long) raw[idx + 6]) & 0xff) << 48)
     99         | (((long) raw[idx + 7]) << 56) );
    100   }
    101 
    102   /**
    103    * Given an idx into a raw array, and an int, write that int into the array at that position.
    104    */
    105   public static void writeUnsignedIntToFourBytes(byte[] raw, int idx, int value) {
    106     raw[idx] = (byte) (value & 0xFF);
    107     raw[idx + 1] = (byte) ((value & 0xFF00) >>> 8);
    108     raw[idx + 2] = (byte) ((value & 0xFF0000) >>> 16);
    109     raw[idx + 3] = (byte) ((value & 0xFF000000) >>> 24);
    110   }
    111 
    112   /**
    113    * Given an idx into a raw array, and a short, write that int into the array at that position.
    114    */
    115   public static void writeUnsignedShortToTwoBytes(byte[] raw, int idx, int value) {
    116     raw[idx] = (byte) (value & 0xFF);
    117     raw[idx + 1] = (byte) ((value & 0xFF00) >>> 8);
    118   }
    119 }
    120