14fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy/*
24fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Licensed to the Apache Software Foundation (ASF) under one or more
34fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * contributor license agreements.  See the NOTICE file distributed with
44fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * this work for additional information regarding copyright ownership.
54fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * The ASF licenses this file to You under the Apache License, Version 2.0
64fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * (the "License"); you may not use this file except in compliance with
74fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * the License.  You may obtain a copy of the License at
84fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *
94fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *      http://www.apache.org/licenses/LICENSE-2.0
104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *
114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Unless required by applicable law or agreed to in writing, software
124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * distributed under the License is distributed on an "AS IS" BASIS,
134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * See the License for the specific language governing permissions and
154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * limitations under the License.
164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */
174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedypackage org.apache.commons.io;
184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.EOFException;
204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.IOException;
214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.InputStream;
224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedyimport java.io.OutputStream;
234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy/**
254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Utility code for dealing with different endian systems.
264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * <p>
274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Different computer architectures adopt different conventions for
284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * byte ordering. In so-called "Little Endian" architectures (eg Intel),
294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * the low-order byte is stored in memory at the lowest address, and
304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * subsequent bytes at higher addresses. For "Big Endian" architectures
314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * (eg Motorola), the situation is reversed.
324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * This class helps you solve this incompatability.
334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * <p>
344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * Origin of code: Excalibur
354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy *
364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @author <a href="mailto:peter@apache.org">Peter Donald</a>
374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @version $Id: EndianUtils.java 539632 2007-05-18 23:37:59Z bayard $
384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy * @see org.apache.commons.io.input.SwappedDataInputStream
394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy */
404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedypublic class EndianUtils {
414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Instances should NOT be constructed in standard programming.
444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public EndianUtils() {
464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        super();
474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    // ========================================== Swapping routines
504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Converts a "short" value between endian systems.
534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to convert
544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the converted value
554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static short swapShort(short value) {
574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return (short) ( ( ( ( value >> 0 ) & 0xff ) << 8 ) +
584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 8 ) & 0xff ) << 0 ) );
594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Converts a "int" value between endian systems.
634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to convert
644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the converted value
654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static int swapInteger(int value) {
674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return
684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 0 ) & 0xff ) << 24 ) +
694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 8 ) & 0xff ) << 16 ) +
704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 16 ) & 0xff ) << 8 ) +
714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 24 ) & 0xff ) << 0 );
724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Converts a "long" value between endian systems.
764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to convert
774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the converted value
784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static long swapLong(long value) {
804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return
814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 0 ) & 0xff ) << 56 ) +
824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 8 ) & 0xff ) << 48 ) +
834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 16 ) & 0xff ) << 40 ) +
844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 24 ) & 0xff ) << 32 ) +
854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 32 ) & 0xff ) << 24 ) +
864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 40 ) & 0xff ) << 16 ) +
874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 48 ) & 0xff ) << 8 ) +
884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( ( value >> 56 ) & 0xff ) << 0 );
894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
904fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
914fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
924fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Converts a "float" value between endian systems.
934fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to convert
944fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the converted value
954fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
964fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static float swapFloat(float value) {
974fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return Float.intBitsToFloat( swapInteger( Float.floatToIntBits( value ) ) );
984fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
994fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1004fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
1014fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Converts a "double" value between endian systems.
1024fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to convert
1034fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the converted value
1044fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
1054fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static double swapDouble(double value) {
1064fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return Double.longBitsToDouble( swapLong( Double.doubleToLongBits( value ) ) );
1074fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1084fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1094fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    // ========================================== Swapping read/write routines
1104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
1124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "short" value to a byte array at a given offset. The value is
1134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
1144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data target byte array
1154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
1164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
1174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
1184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedShort(byte[] data, int offset, short value) {
1194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 0 ] = (byte)( ( value >> 0 ) & 0xff );
1204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 1 ] = (byte)( ( value >> 8 ) & 0xff );
1214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
1244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "short" value from a byte array at a given offset. The value is
1254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
1264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data source byte array
1274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
1284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value read
1294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
1304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static short readSwappedShort(byte[] data, int offset) {
1314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return (short)( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
1324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 1 ] & 0xff ) << 8 ) );
1334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
1364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads an unsigned short (16-bit) value from a byte array at a given
1374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * offset. The value is converted to the opposed endian system while
1384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * reading.
1394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data source byte array
1404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
1414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value read
1424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
1434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static int readSwappedUnsignedShort(byte[] data, int offset) {
1444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
1454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 1 ] & 0xff ) << 8 ) );
1464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
1494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "int" value to a byte array at a given offset. The value is
1504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
1514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data target byte array
1524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
1534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
1544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
1554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedInteger(byte[] data, int offset, int value) {
1564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 0 ] = (byte)( ( value >> 0 ) & 0xff );
1574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 1 ] = (byte)( ( value >> 8 ) & 0xff );
1584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 2 ] = (byte)( ( value >> 16 ) & 0xff );
1594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 3 ] = (byte)( ( value >> 24 ) & 0xff );
1604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
1634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "int" value from a byte array at a given offset. The value is
1644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
1654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data source byte array
1664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
1674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value read
1684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
1694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static int readSwappedInteger(byte[] data, int offset) {
1704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
1714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
1724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 2 ] & 0xff ) << 16 ) +
1734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 3 ] & 0xff ) << 24 ) );
1744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
1774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads an unsigned integer (32-bit) value from a byte array at a given
1784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * offset. The value is converted to the opposed endian system while
1794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * reading.
1804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data source byte array
1814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
1824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value read
1834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
1844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static long readSwappedUnsignedInteger(byte[] data, int offset) {
1854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        long low = ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
1864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                     ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
1874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                     ( ( data[ offset + 2 ] & 0xff ) << 16 ) );
1884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        long high = data[ offset + 3 ] & 0xff;
1904fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1914fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return (high << 24) + (0xffffffffL & low);
1924fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
1934fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
1944fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
1954fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "long" value to a byte array at a given offset. The value is
1964fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
1974fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data target byte array
1984fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
1994fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
2004fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
2014fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedLong(byte[] data, int offset, long value) {
2024fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 0 ] = (byte)( ( value >> 0 ) & 0xff );
2034fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 1 ] = (byte)( ( value >> 8 ) & 0xff );
2044fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 2 ] = (byte)( ( value >> 16 ) & 0xff );
2054fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 3 ] = (byte)( ( value >> 24 ) & 0xff );
2064fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 4 ] = (byte)( ( value >> 32 ) & 0xff );
2074fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 5 ] = (byte)( ( value >> 40 ) & 0xff );
2084fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 6 ] = (byte)( ( value >> 48 ) & 0xff );
2094fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        data[ offset + 7 ] = (byte)( ( value >> 56 ) & 0xff );
2104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
2114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
2134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "long" value from a byte array at a given offset. The value is
2144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
2154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data source byte array
2164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
2174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value read
2184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
2194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static long readSwappedLong(byte[] data, int offset) {
2204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        long low =
2214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
2224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
2234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 2 ] & 0xff ) << 16 ) +
2244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 3 ] & 0xff ) << 24 );
2254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        long high =
2264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 4 ] & 0xff ) << 0 ) +
2274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 5 ] & 0xff ) << 8 ) +
2284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 6 ] & 0xff ) << 16 ) +
2294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( data[ offset + 7 ] & 0xff ) << 24 );
2304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return (high << 32) + (0xffffffffL & low);
2314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
2324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
2344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "float" value to a byte array at a given offset. The value is
2354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
2364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data target byte array
2374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
2384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
2394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
2404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedFloat(byte[] data, int offset, float value) {
2414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        writeSwappedInteger( data, offset, Float.floatToIntBits( value ) );
2424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
2434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
2454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "float" value from a byte array at a given offset. The value is
2464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
2474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data source byte array
2484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
2494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value read
2504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
2514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static float readSwappedFloat(byte[] data, int offset) {
2524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return Float.intBitsToFloat( readSwappedInteger( data, offset ) );
2534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
2544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
2564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "double" value to a byte array at a given offset. The value is
2574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
2584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data target byte array
2594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
2604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
2614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
2624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedDouble(byte[] data, int offset, double value) {
2634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        writeSwappedLong( data, offset, Double.doubleToLongBits( value ) );
2644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
2654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
2674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "double" value from a byte array at a given offset. The value is
2684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
2694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param data source byte array
2704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param offset starting offset in the byte array
2714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value read
2724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
2734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static double readSwappedDouble(byte[] data, int offset) {
2744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return Double.longBitsToDouble( readSwappedLong( data, offset ) );
2754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
2764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
2784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "short" value to an OutputStream. The value is
2794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
2804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param output target OutputStream
2814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
2824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
2834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
2844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedShort(OutputStream output, short value)
2854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
2864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
2874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 0 ) & 0xff ) );
2884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 8 ) & 0xff ) );
2894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
2904fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
2914fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
2924fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "short" value from an InputStream. The value is
2934fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
2944fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param input source InputStream
2954fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value just read
2964fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
2974fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
2984fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static short readSwappedShort(InputStream input)
2994fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
3004fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
3014fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return (short)( ( ( read( input ) & 0xff ) << 0 ) +
3024fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( read( input ) & 0xff ) << 8 ) );
3034fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
3044fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3054fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
3064fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a unsigned short (16-bit) from an InputStream. The value is
3074fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
3084fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param input source InputStream
3094fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value just read
3104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
3114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
3124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static int readSwappedUnsignedShort(InputStream input)
3134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
3144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
3154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value1 = read( input );
3164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value2 = read( input );
3174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return ( ( ( value1 & 0xff ) << 0 ) +
3194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( value2 & 0xff ) << 8 ) );
3204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
3214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
3234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "int" value to an OutputStream. The value is
3244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
3254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param output target OutputStream
3264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
3274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
3284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
3294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedInteger(OutputStream output, int value)
3304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
3314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
3324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 0 ) & 0xff ) );
3334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 8 ) & 0xff ) );
3344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 16 ) & 0xff ) );
3354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 24 ) & 0xff ) );
3364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
3374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
3394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "int" value from an InputStream. The value is
3404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
3414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param input source InputStream
3424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value just read
3434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
3444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
3454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static int readSwappedInteger(InputStream input)
3464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
3474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
3484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value1 = read( input );
3494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value2 = read( input );
3504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value3 = read( input );
3514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value4 = read( input );
3524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return ( ( value1 & 0xff ) << 0 ) +
3544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( value2 & 0xff ) << 8 ) +
3554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( value3 & 0xff ) << 16 ) +
3564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            ( ( value4 & 0xff ) << 24 );
3574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
3584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
3604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a unsigned integer (32-bit) from an InputStream. The value is
3614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
3624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param input source InputStream
3634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value just read
3644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
3654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
3664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static long readSwappedUnsignedInteger(InputStream input)
3674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
3684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
3694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value1 = read( input );
3704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value2 = read( input );
3714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value3 = read( input );
3724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value4 = read( input );
3734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        long low = ( ( ( value1 & 0xff ) << 0 ) +
3754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                     ( ( value2 & 0xff ) << 8 ) +
3764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy                     ( ( value3 & 0xff ) << 16 ) );
3774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        long high = value4 & 0xff;
3794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return (high << 24) + (0xffffffffL & low);
3814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
3824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
3834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
3844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "long" value to an OutputStream. The value is
3854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
3864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param output target OutputStream
3874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
3884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
3894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
3904fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedLong(OutputStream output, long value)
3914fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
3924fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
3934fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 0 ) & 0xff ) );
3944fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 8 ) & 0xff ) );
3954fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 16 ) & 0xff ) );
3964fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 24 ) & 0xff ) );
3974fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 32 ) & 0xff ) );
3984fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 40 ) & 0xff ) );
3994fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 48 ) & 0xff ) );
4004fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        output.write( (byte)( ( value >> 56 ) & 0xff ) );
4014fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
4024fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
4034fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
4044fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "long" value from an InputStream. The value is
4054fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
4064fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param input source InputStream
4074fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value just read
4084fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
4094fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
4104fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static long readSwappedLong(InputStream input)
4114fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
4124fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
4134fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        byte[] bytes = new byte[8];
4144fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        for ( int i=0; i<8; i++ ) {
4154fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            bytes[i] = (byte) read( input );
4164fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
4174fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return readSwappedLong( bytes, 0 );
4184fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
4194fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
4204fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
4214fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "float" value to an OutputStream. The value is
4224fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
4234fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param output target OutputStream
4244fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
4254fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
4264fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
4274fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedFloat(OutputStream output, float value)
4284fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
4294fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
4304fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        writeSwappedInteger( output, Float.floatToIntBits( value ) );
4314fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
4324fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
4334fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
4344fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "float" value from an InputStream. The value is
4354fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
4364fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param input source InputStream
4374fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value just read
4384fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
4394fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
4404fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static float readSwappedFloat(InputStream input)
4414fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
4424fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
4434fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return Float.intBitsToFloat( readSwappedInteger( input ) );
4444fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
4454fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
4464fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
4474fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Writes a "double" value to an OutputStream. The value is
4484fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while writing.
4494fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param output target OutputStream
4504fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param value value to write
4514fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
4524fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
4534fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static void writeSwappedDouble(OutputStream output, double value)
4544fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
4554fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
4564fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        writeSwappedLong( output, Double.doubleToLongBits( value ) );
4574fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
4584fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
4594fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
4604fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads a "double" value from an InputStream. The value is
4614fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * converted to the opposed endian system while reading.
4624fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param input source InputStream
4634fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the value just read
4644fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException in case of an I/O problem
4654fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
4664fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    public static double readSwappedDouble(InputStream input)
4674fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
4684fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
4694fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return Double.longBitsToDouble( readSwappedLong( input ) );
4704fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
4714fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
4724fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    /**
4734fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * Reads the next byte from the input stream.
4744fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @param input  the stream
4754fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @return the byte
4764fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     * @throws IOException if the end of file is reached
4774fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy     */
4784fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    private static int read(InputStream input)
4794fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        throws IOException
4804fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    {
4814fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        int value = input.read();
4824fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
4834fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        if( -1 == value ) {
4844fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy            throw new EOFException( "Unexpected EOF reached" );
4854fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        }
4864fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy
4874fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy        return value;
4884fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy    }
4894fa0a3295bcacbdcd6a9e7709cf17aa5adb90356Scott Kennedy}
490