package mil.nga.giat.geowave.core.store.adapter.statistics.histogram; /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ import java.math.BigDecimal; import java.math.BigInteger; public class ByteUtils { private static final byte[] INFINITY_BYTE = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff }; public static byte[] toBytes( double val ) { BigInteger tmp = new BigDecimal( val).toBigInteger(); byte[] arr = tmp.toByteArray(); if (arr[0] == (byte) 0 && arr.length > 1 && arr[1] == (byte) 0xff) { // to represent {0xff, 0xff}, big integer uses {0x00, 0xff, 0xff} // due to the one's compliment representation. byte[] clipped = new byte[arr.length - 1]; System.arraycopy( arr, 1, clipped, 0, arr.length - 1); arr = clipped; } if (arr.length > 8) { arr = INFINITY_BYTE; } return toPaddedBytes(arr); } public static byte[] toBytes( long val ) { byte[] arr = BigInteger.valueOf( val).toByteArray(); if (arr[0] == (byte) 0 && arr.length > 1 && arr[1] == (byte) 0xff) { // to represent {0xff, 0xff}, big integer uses {0x00, 0xff, 0xff} // due to the one's compliment representation. byte[] clipped = new byte[arr.length - 1]; System.arraycopy( arr, 1, clipped, 0, arr.length - 1); arr = clipped; } if (arr.length > 8) { arr = INFINITY_BYTE; } return toPaddedBytes(arr); } public static long toLong( final byte[] data ) { return new BigInteger( toPaddedBytes(data)).longValue(); } public static double toDouble( final byte[] data ) { return new BigInteger( toPaddedBytes(data)).doubleValue(); } public static byte[] toPaddedBytes( final byte[] b ) { if (b.length == 8) return b; final byte[] newD = new byte[8]; System.arraycopy( b, 0, newD, 0, Math.min( b.length, 8)); return newD; } }