196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * this work for additional information regarding copyright ownership.
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (the "License"); you may not use this file except in compliance with
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the License.  You may obtain a copy of the License at
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage org.apache.commons.io;
1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
1996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.EOFException;
2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.IOException;
2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.InputStream;
2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport java.io.OutputStream;
2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Utility code for dealing with different endian systems.
2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Different computer architectures adopt different conventions for
2896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * byte ordering. In so-called "Little Endian" architectures (eg Intel),
2996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * the low-order byte is stored in memory at the lowest address, and
3096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * subsequent bytes at higher addresses. For "Big Endian" architectures
3196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * (eg Motorola), the situation is reversed.
3296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * This class helps you solve this incompatability.
3396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * <p>
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Origin of code: Excalibur
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @author <a href="mailto:peter@apache.org">Peter Donald</a>
3796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @version $Id: EndianUtils.java 539632 2007-05-18 23:37:59Z bayard $
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * @see org.apache.commons.io.input.SwappedDataInputStream
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpublic class EndianUtils {
4196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Instances should NOT be constructed in standard programming.
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
4596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public EndianUtils() {
4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super();
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
4896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ========================================== Swapping routines
5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Converts a "short" value between endian systems.
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to convert
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the converted value
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static short swapShort(short value) {
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return (short) ( ( ( ( value >> 0 ) & 0xff ) << 8 ) +
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 8 ) & 0xff ) << 0 ) );
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Converts a "int" value between endian systems.
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to convert
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the converted value
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static int swapInteger(int value) {
6796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return
6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 0 ) & 0xff ) << 24 ) +
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 8 ) & 0xff ) << 16 ) +
7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 16 ) & 0xff ) << 8 ) +
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 24 ) & 0xff ) << 0 );
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Converts a "long" value between endian systems.
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to convert
7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the converted value
7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
7996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static long swapLong(long value) {
8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return
8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 0 ) & 0xff ) << 56 ) +
8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 8 ) & 0xff ) << 48 ) +
8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 16 ) & 0xff ) << 40 ) +
8496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 24 ) & 0xff ) << 32 ) +
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 32 ) & 0xff ) << 24 ) +
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 40 ) & 0xff ) << 16 ) +
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 48 ) & 0xff ) << 8 ) +
8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( ( value >> 56 ) & 0xff ) << 0 );
8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
9096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
9196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Converts a "float" value between endian systems.
9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to convert
9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the converted value
9596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static float swapFloat(float value) {
9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return Float.intBitsToFloat( swapInteger( Float.floatToIntBits( value ) ) );
9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
10196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Converts a "double" value between endian systems.
10296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to convert
10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the converted value
10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static double swapDouble(double value) {
10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return Double.longBitsToDouble( swapLong( Double.doubleToLongBits( value ) ) );
10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
10896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
10996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    // ========================================== Swapping read/write routines
11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
11296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "short" value to a byte array at a given offset. The value is
11396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
11496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data target byte array
11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
11696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
11896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedShort(byte[] data, int offset, short value) {
11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 0 ] = (byte)( ( value >> 0 ) & 0xff );
12096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 1 ] = (byte)( ( value >> 8 ) & 0xff );
12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
12296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
12396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
12496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "short" value from a byte array at a given offset. The value is
12596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data source byte array
12796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
12896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value read
12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
13096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static short readSwappedShort(byte[] data, int offset) {
13196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return (short)( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
13296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 1 ] & 0xff ) << 8 ) );
13396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
13496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
13596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
13696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads an unsigned short (16-bit) value from a byte array at a given
13796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * offset. The value is converted to the opposed endian system while
13896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * reading.
13996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data source byte array
14096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
14196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value read
14296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
14396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static int readSwappedUnsignedShort(byte[] data, int offset) {
14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
14596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 1 ] & 0xff ) << 8 ) );
14696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
14796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
14896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
14996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "int" value to a byte array at a given offset. The value is
15096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
15196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data target byte array
15296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
15396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
15496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
15596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedInteger(byte[] data, int offset, int value) {
15696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 0 ] = (byte)( ( value >> 0 ) & 0xff );
15796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 1 ] = (byte)( ( value >> 8 ) & 0xff );
15896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 2 ] = (byte)( ( value >> 16 ) & 0xff );
15996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 3 ] = (byte)( ( value >> 24 ) & 0xff );
16096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
16196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
16296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
16396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "int" value from a byte array at a given offset. The value is
16496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
16596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data source byte array
16696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
16796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value read
16896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
16996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static int readSwappedInteger(byte[] data, int offset) {
17096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
17196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
17296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 2 ] & 0xff ) << 16 ) +
17396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 3 ] & 0xff ) << 24 ) );
17496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
17596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
17696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
17796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads an unsigned integer (32-bit) value from a byte array at a given
17896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * offset. The value is converted to the opposed endian system while
17996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * reading.
18096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data source byte array
18196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
18296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value read
18396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
18496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static long readSwappedUnsignedInteger(byte[] data, int offset) {
18596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        long low = ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
18696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                     ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
18796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                     ( ( data[ offset + 2 ] & 0xff ) << 16 ) );
18896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
18996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        long high = data[ offset + 3 ] & 0xff;
19096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
19196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return (high << 24) + (0xffffffffL & low);
19296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
19396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
19496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
19596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "long" value to a byte array at a given offset. The value is
19696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
19796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data target byte array
19896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
19996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
20096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
20196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedLong(byte[] data, int offset, long value) {
20296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 0 ] = (byte)( ( value >> 0 ) & 0xff );
20396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 1 ] = (byte)( ( value >> 8 ) & 0xff );
20496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 2 ] = (byte)( ( value >> 16 ) & 0xff );
20596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 3 ] = (byte)( ( value >> 24 ) & 0xff );
20696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 4 ] = (byte)( ( value >> 32 ) & 0xff );
20796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 5 ] = (byte)( ( value >> 40 ) & 0xff );
20896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 6 ] = (byte)( ( value >> 48 ) & 0xff );
20996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        data[ offset + 7 ] = (byte)( ( value >> 56 ) & 0xff );
21096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
21196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
21296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
21396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "long" value from a byte array at a given offset. The value is
21496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
21596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data source byte array
21696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
21796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value read
21896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
21996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static long readSwappedLong(byte[] data, int offset) {
22096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        long low =
22196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
22296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
22396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 2 ] & 0xff ) << 16 ) +
22496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 3 ] & 0xff ) << 24 );
22596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        long high =
22696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 4 ] & 0xff ) << 0 ) +
22796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 5 ] & 0xff ) << 8 ) +
22896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 6 ] & 0xff ) << 16 ) +
22996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( data[ offset + 7 ] & 0xff ) << 24 );
23096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return (high << 32) + (0xffffffffL & low);
23196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
23296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
23396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
23496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "float" value to a byte array at a given offset. The value is
23596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
23696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data target byte array
23796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
23896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
23996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
24096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedFloat(byte[] data, int offset, float value) {
24196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        writeSwappedInteger( data, offset, Float.floatToIntBits( value ) );
24296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
24396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
24496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
24596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "float" value from a byte array at a given offset. The value is
24696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
24796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data source byte array
24896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
24996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value read
25096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
25196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static float readSwappedFloat(byte[] data, int offset) {
25296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return Float.intBitsToFloat( readSwappedInteger( data, offset ) );
25396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
25496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
25596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
25696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "double" value to a byte array at a given offset. The value is
25796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
25896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data target byte array
25996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
26096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
26196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
26296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedDouble(byte[] data, int offset, double value) {
26396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        writeSwappedLong( data, offset, Double.doubleToLongBits( value ) );
26496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
26596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
26696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
26796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "double" value from a byte array at a given offset. The value is
26896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
26996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param data source byte array
27096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param offset starting offset in the byte array
27196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value read
27296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
27396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static double readSwappedDouble(byte[] data, int offset) {
27496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return Double.longBitsToDouble( readSwappedLong( data, offset ) );
27596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
27696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
27796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
27896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "short" value to an OutputStream. The value is
27996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
28096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output target OutputStream
28196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
28296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
28396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
28496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedShort(OutputStream output, short value)
28596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
28696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
28796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 0 ) & 0xff ) );
28896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 8 ) & 0xff ) );
28996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
29096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
29196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
29296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "short" value from an InputStream. The value is
29396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
29496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input source InputStream
29596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value just read
29696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
29796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
29896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static short readSwappedShort(InputStream input)
29996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
30096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
30196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return (short)( ( ( read( input ) & 0xff ) << 0 ) +
30296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( read( input ) & 0xff ) << 8 ) );
30396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
30496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
30596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
30696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a unsigned short (16-bit) from an InputStream. The value is
30796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
30896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input source InputStream
30996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value just read
31096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
31196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
31296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static int readSwappedUnsignedShort(InputStream input)
31396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
31496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
31596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value1 = read( input );
31696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value2 = read( input );
31796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
31896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return ( ( ( value1 & 0xff ) << 0 ) +
31996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( value2 & 0xff ) << 8 ) );
32096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
32196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
32296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
32396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "int" value to an OutputStream. The value is
32496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
32596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output target OutputStream
32696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
32796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
32896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
32996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedInteger(OutputStream output, int value)
33096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
33196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
33296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 0 ) & 0xff ) );
33396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 8 ) & 0xff ) );
33496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 16 ) & 0xff ) );
33596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 24 ) & 0xff ) );
33696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
33796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
33896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
33996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "int" value from an InputStream. The value is
34096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
34196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input source InputStream
34296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value just read
34396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
34496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
34596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static int readSwappedInteger(InputStream input)
34696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
34796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
34896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value1 = read( input );
34996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value2 = read( input );
35096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value3 = read( input );
35196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value4 = read( input );
35296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
35396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return ( ( value1 & 0xff ) << 0 ) +
35496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( value2 & 0xff ) << 8 ) +
35596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( value3 & 0xff ) << 16 ) +
35696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            ( ( value4 & 0xff ) << 24 );
35796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
35896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
35996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
36096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a unsigned integer (32-bit) from an InputStream. The value is
36196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
36296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input source InputStream
36396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value just read
36496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
36596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
36696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static long readSwappedUnsignedInteger(InputStream input)
36796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
36896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
36996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value1 = read( input );
37096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value2 = read( input );
37196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value3 = read( input );
37296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value4 = read( input );
37396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
37496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        long low = ( ( ( value1 & 0xff ) << 0 ) +
37596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                     ( ( value2 & 0xff ) << 8 ) +
37696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project                     ( ( value3 & 0xff ) << 16 ) );
37796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
37896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        long high = value4 & 0xff;
37996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
38096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return (high << 24) + (0xffffffffL & low);
38196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
38296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
38396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
38496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "long" value to an OutputStream. The value is
38596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
38696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output target OutputStream
38796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
38896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
38996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
39096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedLong(OutputStream output, long value)
39196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
39296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
39396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 0 ) & 0xff ) );
39496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 8 ) & 0xff ) );
39596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 16 ) & 0xff ) );
39696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 24 ) & 0xff ) );
39796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 32 ) & 0xff ) );
39896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 40 ) & 0xff ) );
39996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 48 ) & 0xff ) );
40096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        output.write( (byte)( ( value >> 56 ) & 0xff ) );
40196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
40296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
40396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
40496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "long" value from an InputStream. The value is
40596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
40696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input source InputStream
40796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value just read
40896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
40996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
41096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static long readSwappedLong(InputStream input)
41196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
41296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
41396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        byte[] bytes = new byte[8];
41496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        for ( int i=0; i<8; i++ ) {
41596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            bytes[i] = (byte) read( input );
41696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
41796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return readSwappedLong( bytes, 0 );
41896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
41996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
42096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
42196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "float" value to an OutputStream. The value is
42296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
42396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output target OutputStream
42496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
42596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
42696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
42796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedFloat(OutputStream output, float value)
42896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
42996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
43096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        writeSwappedInteger( output, Float.floatToIntBits( value ) );
43196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
43296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
43396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
43496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "float" value from an InputStream. The value is
43596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
43696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input source InputStream
43796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value just read
43896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
43996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
44096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static float readSwappedFloat(InputStream input)
44196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
44296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
44396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return Float.intBitsToFloat( readSwappedInteger( input ) );
44496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
44596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
44696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
44796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Writes a "double" value to an OutputStream. The value is
44896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while writing.
44996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param output target OutputStream
45096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param value value to write
45196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
45296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
45396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static void writeSwappedDouble(OutputStream output, double value)
45496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
45596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
45696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        writeSwappedLong( output, Double.doubleToLongBits( value ) );
45796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
45896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
45996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
46096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads a "double" value from an InputStream. The value is
46196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * converted to the opposed endian system while reading.
46296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input source InputStream
46396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the value just read
46496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException in case of an I/O problem
46596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
46696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public static double readSwappedDouble(InputStream input)
46796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
46896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
46996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return Double.longBitsToDouble( readSwappedLong( input ) );
47096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
47196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
47296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
47396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Reads the next byte from the input stream.
47496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @param input  the stream
47596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @return the byte
47696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * @throws IOException if the end of file is reached
47796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
47896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private static int read(InputStream input)
47996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        throws IOException
48096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    {
48196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        int value = input.read();
48296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
48396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        if( -1 == value ) {
48496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project            throw new EOFException( "Unexpected EOF reached" );
48596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        }
48696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
48796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        return value;
48896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
48996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
490