/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ddmlib.utils;
/**
* Utility class providing array to int/long conversion for data received from devices through adb.
*/
public final class ArrayHelper {
/**
* Swaps an unsigned value around, and puts the result in an array that can be sent to a device.
* @param value The value to swap.
* @param dest the destination array
* @param offset the offset in the array where to put the swapped value.
* Array length must be at least offset + 4
*/
public static void swap32bitsToArray(int value, byte[] dest, int offset) {
dest[offset] = (byte)(value & 0x000000FF);
dest[offset + 1] = (byte)((value & 0x0000FF00) >> 8);
dest[offset + 2] = (byte)((value & 0x00FF0000) >> 16);
dest[offset + 3] = (byte)((value & 0xFF000000) >> 24);
}
/**
* Reads a signed 32 bit integer from an array coming from a device.
* @param value the array containing the int
* @param offset the offset in the array at which the int starts
* @return the integer read from the array
*/
public static int swap32bitFromArray(byte[] value, int offset) {
int v = 0;
v |= ((int)value[offset]) & 0x000000FF;
v |= (((int)value[offset + 1]) & 0x000000FF) << 8;
v |= (((int)value[offset + 2]) & 0x000000FF) << 16;
v |= (((int)value[offset + 3]) & 0x000000FF) << 24;
return v;
}
/**
* Reads an unsigned 16 bit integer from an array coming from a device,
* and returns it as an 'int'
* @param value the array containing the 16 bit int (2 byte).
* @param offset the offset in the array at which the int starts
* Array length must be at least offset + 2
* @return the integer read from the array.
*/
public static int swapU16bitFromArray(byte[] value, int offset) {
int v = 0;
v |= ((int)value[offset]) & 0x000000FF;
v |= (((int)value[offset + 1]) & 0x000000FF) << 8;
return v;
}
/**
* Reads a signed 64 bit integer from an array coming from a device.
* @param value the array containing the int
* @param offset the offset in the array at which the int starts
* Array length must be at least offset + 8
* @return the integer read from the array
*/
public static long swap64bitFromArray(byte[] value, int offset) {
long v = 0;
v |= ((long)value[offset]) & 0x00000000000000FFL;
v |= (((long)value[offset + 1]) & 0x00000000000000FFL) << 8;
v |= (((long)value[offset + 2]) & 0x00000000000000FFL) << 16;
v |= (((long)value[offset + 3]) & 0x00000000000000FFL) << 24;
v |= (((long)value[offset + 4]) & 0x00000000000000FFL) << 32;
v |= (((long)value[offset + 5]) & 0x00000000000000FFL) << 40;
v |= (((long)value[offset + 6]) & 0x00000000000000FFL) << 48;
v |= (((long)value[offset + 7]) & 0x00000000000000FFL) << 56;
return v;
}
}
|