diff options
Diffstat (limited to 'xmerge/source/xmerge/java/org/openoffice/xmerge/util/EndianConverter.java')
-rw-r--r-- | xmerge/source/xmerge/java/org/openoffice/xmerge/util/EndianConverter.java | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/xmerge/source/xmerge/java/org/openoffice/xmerge/util/EndianConverter.java b/xmerge/source/xmerge/java/org/openoffice/xmerge/util/EndianConverter.java new file mode 100644 index 000000000000..c41a428dd0c2 --- /dev/null +++ b/xmerge/source/xmerge/java/org/openoffice/xmerge/util/EndianConverter.java @@ -0,0 +1,178 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package org.openoffice.xmerge.util; + + +/** + * <p>Helper class providing static methods to convert data to/from + * Network Byte Order (Big Endian).</p> + * + * <p>With the introduction of <code>java.nio.ByteOrder</code> and + * <code>java.nio.ByteBuffer</code> in Java 1.4, it may no longer be + * necessary to use this class in the future.</p> + * + * @author Mark Murnane + * @version 1.1 + */ +public class EndianConverter { + + /** + * <p>Convert a <code>short</code> to a Little Endian representation.</p> + * + * @param value The <code>short</code> to be converted. + * + * @return Two element <code>byte</code> array containing the converted + * value. + */ + public static byte[] writeShort (short value) { + byte[] leShort = new byte[2]; + + leShort[0] = (byte) value; + leShort[1] = (byte) (value >>> 8); + + return leShort; + } + + + /** + * <p>Convert an integer to a Little Endian representation.</p> + * + * @param value The <code>int</code> to be converted. + * + * @return Four element <code>byte</code> array containing the converted + * value. + */ + public static byte[] writeInt (int value) { + byte[] leInt = new byte[4]; + + leInt[0] = (byte) value; + leInt[1] = (byte) (value >>> 8); + leInt[2] = (byte) (value >>> 16); + leInt[3] = (byte) (value >>> 24); + + return leInt; + } + + /** + * <p>Converts a <code>double</code> to a Little Endian representation + * of a float in IEEE-754 format. + * + * <p>An array with more than eight elements can be used, but only the first + * eight elements will be read.</p> + * + * @param value <code>double</code> containing the value to be converted + * + * @return <code>byte</code> array containing the LE representation of a IEEE-754 float + */ + public static byte[] writeDouble(double value) { + + long myDouble = Double.doubleToLongBits(value); + byte[] leDouble = new byte[8]; + + leDouble[0] = (byte) (myDouble >>> 0); + leDouble[1] = (byte) (myDouble >>> 8); + leDouble[2] = (byte) (myDouble >>> 16); + leDouble[3] = (byte) (myDouble >>> 24); + leDouble[4] = (byte) (myDouble >>> 32); + leDouble[5] = (byte) (myDouble >>> 40); + leDouble[6] = (byte) (myDouble >>> 48); + leDouble[7] = (byte) (myDouble >>> 56); + + return leDouble; + } + + /** + * <p>Convert a Little Endian representation of a short to a Java + * <code>short</code> (Network Byte Order).</p> + * + * <p>An array with more than two elements can be used, but only the first + * two elements will be read.</p> + * + * @param value <code>byte</code> array containing the LE representation + * of the value. + * + * @return <code>short</code> containing the converted value. + */ + public static short readShort (byte[] value) { + int high, low; + + high = value[1] & 0xFF; + low = value[0] & 0xFF; + + return (short)(high << 8 | low); + } + + + /** + * <p>Convert a Little Endian representation of an integer to a Java + * <code>int</code> (Network Byte Order).</p> + * + * <p>An array with more than four elements can be used, but only the first + * four elements will be read.</p> + * + * @param value <code>byte</code> array containing the LE representation + * of the value. + * + * @return <code>int</code> containing the converted value. + */ + public static int readInt(byte[] value) { + int number = 0; + + for (int i = 0; i < 4; i++) { + number |= (value[i] & 0xFF) << ( i * 8); + } + + return number; + } + + /** + * <p>Convert a Little Endian representation of a float in IEEE-754 Little + * Endian to a Java <code>double</code> (Network Byte Order).</p> + * + * <p>An array with more than eight elements can be used, but only the first + * eight elements will be read.</p> + * + * @param value <code>byte</code> array containing the LE representation + * of a IEEE-754 float. + * + * @return <code>double</code> containing the converted value. + */ + public static double readDouble(byte[] value) { + + long lvalue = ( ((long)(value[7]) << 56) + + ((long)(value[6]&0xFF) << 48) + + ((long)(value[5]&0xFF) << 40) + + ((long)(value[4]&0xFF) << 32) + + ((long)(value[3]&0xFF) << 24) + + ((long)(value[2]&0xFF) << 16) + + ((long)(value[1]&0xFF) << 8) + + (long)(value[0]&0xFF)); + + return Double.longBitsToDouble(lvalue); + } +} |