/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2001, 2015 Oracle and/or its affiliates. All rights reserved.
*
* $Id$
*/
package com.sleepycat.db.internal;
/**
* DbUtil is a simple class that holds a few static utility functions other
* parts of the package share and that don't have a good home elsewhere. (For
* now, that's limited to byte-array-to-int conversion and back.)
*/
public class DbUtil {
/**
* Get the u_int32_t stored beginning at offset "offset" into
* array "arr". We have to do the conversion manually since it's
* a C-native int, and we're not really supposed to make this
* kind of cast in Java.
*
* @return Description of the Return Value
*/
public static int array2int(byte[] arr, int offset) {
int b1;
int b2;
int b3;
int b4;
int pos = offset;
// Get the component bytes; b4 is most significant, b1 least.
if (big_endian) {
b4 = arr[pos++];
b3 = arr[pos++];
b2 = arr[pos++];
b1 = arr[pos];
} else {
b1 = arr[pos++];
b2 = arr[pos++];
b3 = arr[pos++];
b4 = arr[pos];
}
// Bytes are signed. Convert [-128, -1] to [128, 255].
if (b1 < 0) {
b1 += 256;
}
if (b2 < 0) {
b2 += 256;
}
if (b3 < 0) {
b3 += 256;
}
if (b4 < 0) {
b4 += 256;
}
// Put the bytes in their proper places in an int.
b2 <<= 8;
b3 <<= 16;
b4 <<= 24;
// Return their sum.
return (b1 + b2 + b3 + b4);
}
/**
* Store the specified u_int32_t, with endianness appropriate to
* the platform we're running on, into four consecutive bytes of
* the specified byte array, starting from the specified offset.
*/
public static void int2array(int n, byte[] arr, int offset) {
int b1;
int b2;
int b3;
int b4;
int pos = offset;
b1 = n & 0xff;
b2 = (n >> 8) & 0xff;
b3 = (n >> 16) & 0xff;
b4 = (n >> 24) & 0xff;
// Bytes are signed. Convert [128, 255] to [-128, -1].
if (b1 >= 128) {
b1 -= 256;
}
if (b2 >= 128) {
b2 -= 256;
}
if (b3 >= 128) {
b3 -= 256;
}
if (b4 >= 128) {
b4 -= 256;
}
// Put the bytes in the appropriate place in the array.
if (big_endian) {
arr[pos++] = (byte) b4;
arr[pos++] = (byte) b3;
arr[pos++] = (byte) b2;
arr[pos] = (byte) b1;
} else {
arr[pos++] = (byte) b1;
arr[pos++] = (byte) b2;
arr[pos++] = (byte) b3;
arr[pos] = (byte) b4;
}
}
/**
* Convert a byte array to a concise, readable string suitable
* for use in toString methods of the *Stat classes.
*
* @return Description of the Return Value
*/
public static String byteArrayToString(byte[] barr) {
if (barr == null) {
return "null";
}
StringBuffer sb = new StringBuffer();
int len = barr.length;
for (int i = 0; i < len; i++) {
sb.append('x');
int val = (barr[i] >> 4) & 0xf;
if (val < 10) {
sb.append((char) ('0' + val));
} else {
sb.append((char) ('a' + val - 10));
}
val = barr[i] & 0xf;
if (val < 10) {
sb.append((char) ('0' + val));
} else {
sb.append((char) ('a' + val - 10));
}
}
return sb.toString();
}
/**
* Convert an object array to a string, suitable for use in
* toString methods of the *Stat classes.
*
* @return Description of the Return Value
*/
public static String objectArrayToString(Object[] arr, String name) {
if (arr == null) {
return "null";
}
StringBuffer sb = new StringBuffer();
int len = arr.length;
for (int i = 0; i < len; i++) {
sb.append("\n " + name + "[" + i + "]:\n");
sb.append(" " + arr[i].toString());
}
return sb.toString();
}
public static int default_lorder() {
return big_endian ? 4321 : 1234;
}
private final static boolean big_endian = is_big_endian();
/**
* @return Description of the Return Value
*/
private native static boolean is_big_endian();
}