001 /*
002 * Copyright (c) 2003 Objectix Pty Ltd All rights reserved.
003 *
004 * This library is free software; you can redistribute it and/or
005 * modify it under the terms of the GNU Lesser General Public
006 * License as published by the Free Software Foundation.
007 *
008 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
009 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
010 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
011 * DISCLAIMED. IN NO EVENT SHALL OBJECTIX PTY LTD BE LIABLE FOR ANY
012 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
013 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
014 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
015 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
016 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
017 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
018 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
019 */
020 package org.openstreetmap.josm.data.projection.datum;
021
022 /**
023 * A set of static utility methods for reading the NTv2 file format
024 *
025 * @author Peter Yuill
026 */
027 public class NTV2Util {
028
029 private NTV2Util() {
030 }
031
032 /**
033 * Get a Little Endian int from four bytes of a byte array
034 * @param b the byte array
035 * @param i the index of the first data byte in the array
036 * @return the int
037 */
038 public static final int getIntLE(byte[] b, int i) {
039 return (b[i++] & 0x000000FF) | ((b[i++] << 8) & 0x0000FF00) | ((b[i++] << 16) & 0x00FF0000) | (b[i] << 24);
040 }
041
042 /**
043 * Get a Big Endian int from four bytes of a byte array
044 * @param b the byte array
045 * @param i the index of the first data byte in the array
046 * @return the int
047 */
048 public static final int getIntBE(byte[] b, int i) {
049 return (b[i++] << 24) | ((b[i++] << 16) & 0x00FF0000) | ((b[i++] << 8) & 0x0000FF00) | (b[i] & 0x000000FF);
050 }
051
052 /**
053 * Get an int from the first 4 bytes of a byte array,
054 * in either Big Endian or Little Endian format.
055 * @param b the byte array
056 * @param bigEndian is the byte array Big Endian?
057 * @return the int
058 */
059 public static final int getInt(byte[] b, boolean bigEndian) {
060 if (bigEndian)
061 return getIntBE(b, 0);
062 else
063 return getIntLE(b, 0);
064 }
065
066 /**
067 * Get a float from the first 4 bytes of a byte array,
068 * in either Big Endian or Little Endian format.
069 * @param b the byte array
070 * @param bigEndian is the byte array Big Endian?
071 * @return the float
072 */
073 public static final float getFloat(byte[] b, boolean bigEndian) {
074 int i = 0;
075 if (bigEndian) {
076 i = getIntBE(b, 0);
077 } else {
078 i = getIntLE(b, 0);
079 }
080 return Float.intBitsToFloat(i);
081 }
082
083 /**
084 * Get a double from the first 8 bytes of a byte array,
085 * in either Big Endian or Little Endian format.
086 * @param b the byte array
087 * @param bigEndian is the byte array Big Endian?
088 * @return the double
089 */
090 public static final double getDouble(byte[] b, boolean bigEndian) {
091 int i = 0;
092 int j = 0;
093 if (bigEndian) {
094 i = getIntBE(b, 0);
095 j = getIntBE(b, 4);
096 } else {
097 i = getIntLE(b, 4);
098 j = getIntLE(b, 0);
099 }
100 long l = ((long)i << 32) |
101 (j & 0x00000000FFFFFFFFL);
102 return Double.longBitsToDouble(l);
103 }
104
105 /**
106 * Does the current VM support the New IO api
107 * @return true or false
108 */
109 public static boolean isNioAvailable() {
110 boolean nioAvailable = false;
111 try {
112 Class.forName("java.nio.channels.FileChannel");
113 nioAvailable = true;
114 } catch (ClassNotFoundException cnfe) {}
115 return nioAvailable;
116 }
117 }