/*
* Copyright (c) 2011, PostgreSQL Global Development Group
* See the LICENSE file in the project root for more information.
*/
package org.postgresql.util;
/**
* Helper methods to parse java base types from byte arrays.
*
* @author Mikko Tiihonen
*/
public class
ByteConverter {
private
ByteConverter() {
// prevent instantiation of static helper class
}
/**
* Parses a long value from the byte array.
*
* @param bytes The byte array to parse.
* @param idx The starting index of the parse in the byte array.
* @return parsed long value.
*/
public static long
int8(byte[]
bytes, int
idx) {
return
((long) (
bytes[
idx + 0] & 255) << 56)
+ ((long) (
bytes[
idx + 1] & 255) << 48)
+ ((long) (
bytes[
idx + 2] & 255) << 40)
+ ((long) (
bytes[
idx + 3] & 255) << 32)
+ ((long) (
bytes[
idx + 4] & 255) << 24)
+ ((long) (
bytes[
idx + 5] & 255) << 16)
+ ((long) (
bytes[
idx + 6] & 255) << 8)
+ (
bytes[
idx + 7] & 255);
}
/**
* Parses an int value from the byte array.
*
* @param bytes The byte array to parse.
* @param idx The starting index of the parse in the byte array.
* @return parsed int value.
*/
public static int
int4(byte[]
bytes, int
idx) {
return
((
bytes[
idx] & 255) << 24)
+ ((
bytes[
idx + 1] & 255) << 16)
+ ((
bytes[
idx + 2] & 255) << 8)
+ ((
bytes[
idx + 3] & 255));
}
/**
* Parses a short value from the byte array.
*
* @param bytes The byte array to parse.
* @param idx The starting index of the parse in the byte array.
* @return parsed short value.
*/
public static short
int2(byte[]
bytes, int
idx) {
return (short) (((
bytes[
idx] & 255) << 8) + ((
bytes[
idx + 1] & 255)));
}
/**
* Parses a boolean value from the byte array.
*
* @param bytes
* The byte array to parse.
* @param idx
* The starting index to read from bytes.
* @return parsed boolean value.
*/
public static boolean
bool(byte[]
bytes, int
idx) {
return
bytes[
idx] == 1;
}
/**
* Parses a float value from the byte array.
*
* @param bytes The byte array to parse.
* @param idx The starting index of the parse in the byte array.
* @return parsed float value.
*/
public static float
float4(byte[]
bytes, int
idx) {
return
Float.
intBitsToFloat(
int4(
bytes,
idx));
}
/**
* Parses a double value from the byte array.
*
* @param bytes The byte array to parse.
* @param idx The starting index of the parse in the byte array.
* @return parsed double value.
*/
public static double
float8(byte[]
bytes, int
idx) {
return
Double.
longBitsToDouble(
int8(
bytes,
idx));
}
/**
* Encodes a long value to the byte array.
*
* @param target The byte array to encode to.
* @param idx The starting index in the byte array.
* @param value The value to encode.
*/
public static void
int8(byte[]
target, int
idx, long
value) {
target[
idx + 0] = (byte) (
value >>> 56);
target[
idx + 1] = (byte) (
value >>> 48);
target[
idx + 2] = (byte) (
value >>> 40);
target[
idx + 3] = (byte) (
value >>> 32);
target[
idx + 4] = (byte) (
value >>> 24);
target[
idx + 5] = (byte) (
value >>> 16);
target[
idx + 6] = (byte) (
value >>> 8);
target[
idx + 7] = (byte)
value;
}
/**
* Encodes a int value to the byte array.
*
* @param target The byte array to encode to.
* @param idx The starting index in the byte array.
* @param value The value to encode.
*/
public static void
int4(byte[]
target, int
idx, int
value) {
target[
idx + 0] = (byte) (
value >>> 24);
target[
idx + 1] = (byte) (
value >>> 16);
target[
idx + 2] = (byte) (
value >>> 8);
target[
idx + 3] = (byte)
value;
}
/**
* Encodes a int value to the byte array.
*
* @param target The byte array to encode to.
* @param idx The starting index in the byte array.
* @param value The value to encode.
*/
public static void
int2(byte[]
target, int
idx, int
value) {
target[
idx + 0] = (byte) (
value >>> 8);
target[
idx + 1] = (byte)
value;
}
/**
* Encodes a boolean value to the byte array.
*
* @param target
* The byte array to encode to.
* @param idx
* The starting index in the byte array.
* @param value
* The value to encode.
*/
public static void
bool(byte[]
target, int
idx, boolean
value) {
target[
idx] =
value ? (byte) 1 : (byte) 0;
}
/**
* Encodes a int value to the byte array.
*
* @param target The byte array to encode to.
* @param idx The starting index in the byte array.
* @param value The value to encode.
*/
public static void
float4(byte[]
target, int
idx, float
value) {
int4(
target,
idx,
Float.
floatToRawIntBits(
value));
}
/**
* Encodes a int value to the byte array.
*
* @param target The byte array to encode to.
* @param idx The starting index in the byte array.
* @param value The value to encode.
*/
public static void
float8(byte[]
target, int
idx, double
value) {
int8(
target,
idx,
Double.
doubleToRawLongBits(
value));
}
}