/* * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this program (see the file COPYING.LIB for more * details); if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.dcache.util; /** * * @since 0.0.3 */ public final class Bytes { private Bytes() { } /** * Puts a big-endian representation of {@code value} into <code>bytes</code> * staring from <code>offset</code>. * @param bytes * @param offset * @param value * @throws IllegalArgumentException there is no enough room for 8 bytes. */ public static void putLong(byte[] bytes, int offset, long value) throws IllegalArgumentException { if (bytes.length - offset < 8) { throw new IllegalArgumentException("not enough space to store long"); } bytes[offset] = (byte) (value >> 56); bytes[offset + 1] = (byte) (value >> 48); bytes[offset + 2] = (byte) (value >> 40); bytes[offset + 3] = (byte) (value >> 32); bytes[offset + 4] = (byte) (value >> 24); bytes[offset + 5] = (byte) (value >> 16); bytes[offset + 6] = (byte) (value >> 8); bytes[offset + 7] = (byte) value; } /** * Puts a big-endian representation of {@code value} into <code>bytes</code> * staring from <code>offset</code>. * @param bytes * @param offset * @param value * @throws IllegalArgumentException there is no enough room for 4 bytes. */ public static void putInt(byte[] bytes, int offset, int value) throws IllegalArgumentException { if (bytes.length - offset < 4) { throw new IllegalArgumentException("not enough space to store int"); } bytes[offset] = (byte) (value >> 24); bytes[offset + 1] = (byte) (value >> 16); bytes[offset + 2] = (byte) (value >> 8); bytes[offset + 3] = (byte) value; } /** * Returns the big-endian {@code long} value whose byte representation is the 8 * bytes of <code>bytes</code> staring <code>offset</code>. * @param bytes * @param offset * @return long value */ public static long getLong(byte[] bytes, int offset) { return (bytes[offset] & 0xFFL) << 56 | (bytes[offset + 1] & 0xFFL) << 48 | (bytes[offset + 2] & 0xFFL) << 40 | (bytes[offset + 3] & 0xFFL) << 32 | (bytes[offset + 4] & 0xFFL) << 24 | (bytes[offset + 5] & 0xFFL) << 16 | (bytes[offset + 6] & 0xFFL) << 8 | (bytes[offset + 7] & 0xFFL); } /** * Returns the big-endian {@code int} value whose byte representation is the 4 * bytes of <code>bytes</code> staring <code>offset</code>. * @param bytes * @param offset * @return int value */ public static int getInt(byte[] bytes, int offset) { return (bytes[offset + 0] & 0xFF) << 24 | (bytes[offset + 1] & 0xFF) << 16 | (bytes[offset + 2] & 0xFF) << 8 | (bytes[offset + 3] & 0xFF); } private static final char[] HEX = { '0','1','2','3','4','5','6','7', '8','9','a','b','c','d','e','f' }; /** * Returns a hexadecimal representation of given byte array. * * @param bytes whose string representation to return * @return a string representation of <tt>bytes</tt> */ public static String toHexString(byte[] bytes) { char[] chars = new char[bytes.length*2]; int p = 0; for(byte b : bytes) { int i = b & 0xff; chars[p++] = HEX[i / 16]; chars[p++] = HEX[i%16]; } return new String(chars); } }