/* * This file is part of the HyperGraphDB source distribution. This is copyrighted * software. For permitted uses, licensing options and redistribution, please see * the LicensingInformation file at the root level of the distribution. * * Copyright (c) 2005-2010 Kobrix Software, Inc. All rights reserved. */ package org.hypergraphdb.storage; /** * <p> * This class contains some utilities methods to read/write primitively typed values from/to * a byte buffer. * </p> * * @author Borislav Iordanov */ public class BAUtils { public static long readLong(byte [] data, int offset) { return readUnsignedLong(data, offset) ^ 0x8000000000000000L; } private static long readUnsignedLong(byte [] data, int offset) { return (((long)(data[offset] & 255) << 56) + ((long)(data[offset + 1] & 255) << 48) + ((long)(data[offset + 2] & 255) << 40) + ((long)(data[offset + 3] & 255) << 32) + ((long)(data[offset + 4] & 255) << 24) + ((long)(data[offset + 5] & 255) << 16) + ((long)(data[offset + 6] & 255) << 8) + ((long)(data[offset + 7] & 255) << 0)); } public static void writeLong(long v, byte [] data, int offset) { writeUnsignedLong(v ^ 0x8000000000000000L, data, offset); } public static void writeUnsignedLong(long v, byte [] data, int offset) { data[offset] = (byte) ((v >>> 56)); data[offset + 1] = (byte) ((v >>> 48)); data[offset + 2] = (byte) ((v >>> 40)); data[offset + 3] = (byte) ((v >>> 32)); data[offset + 4] = (byte) ((v >>> 24)); data[offset + 5] = (byte) ((v >>> 16)); data[offset + 6] = (byte) ((v >>> 8)); data[offset + 7] = (byte) ((v >>> 0)); } public static int readInt(byte[] data, int offset) { return (int) (readUnsignedInt(data, offset) ^ 0x80000000); } public static long readUnsignedInt(byte[] data, int offset) { long c1 = (data[offset] & 0xFF); long c2 = (data[offset + 1] & 0xFF); long c3 = (data[offset + 2] & 0xFF); long c4 = (data[offset + 3] & 0xFF); return ((c1 << 24) | (c2 << 16) | (c3 << 8) | c4); } public static void writeInt(int val, byte[] data, int offset) { writeUnsignedInt(val ^ 0x80000000, data, offset); } public static void writeUnsignedInt(long c, byte[] data, int offset) { data[offset + 0] = (byte) ((c >>> 24) & 0xFF); data[offset + 1] = (byte) ((c >>> 16) & 0xFF); data[offset + 2] = (byte) ((c >>> 8) & 0xFF); data[offset + 3] = (byte) ((c >>> 0) & 0xFF); } public static boolean eq(byte[] left, int leftPos, byte[] right, int rightPos, int size) { int i = leftPos, j = rightPos; if (leftPos + size > left.length) return false; if (rightPos + size > right.length) return false; while (size > 0) { if (left[i++] != right[j++]) return false; size--; } return true; } public static int compare(byte[] left, int leftPos, byte[] right, int rightPos, int max) { int maxLeft = leftPos + max; int maxRight = rightPos + max; int i = leftPos; int j = rightPos; int comp = 0; while (comp == 0 && i < maxLeft && j < maxRight) comp = left[i++] - right[j++]; return comp; } }