001    /* JAPI - (Yet another (hopefully) useful) Java API
002     *
003     * Copyright (C) 2004-2006 Christian Hujer
004     *
005     * This program is free software; you can redistribute it and/or
006     * modify it under the terms of the GNU General Public License as
007     * published by the Free Software Foundation; either version 2 of the
008     * License, or (at your option) any later version.
009     *
010     * This program is distributed in the hope that it will be useful, but
011     * WITHOUT ANY WARRANTY; without even the implied warranty of
012     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
013     * General Public License for more details.
014     *
015     * You should have received a copy of the GNU General Public License
016     * along with this program; if not, write to the Free Software
017     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
018     * 02111-1307, USA.
019     */
020    
021    package net.sf.japi.util;
022    
023    /** Class to convert data from little endian to big endian and vice versa.
024     * Since the conversion is symmetric, there are no special conversion methods, just generic ones, e.g. the same method is used to convert a little
025     * endian integer to a big endian integer and vice versa.
026     * @author <a href="mailto:chris@riedquat.de">Christian Hujer</a>
027     */
028    @SuppressWarnings({"UtilityClass"})
029    public class EndianConverter {
030    
031        /** Private constructor to prevent instantiation. */
032        private EndianConverter() {
033        }
034    
035        /** Convert a double.
036         * This method changes byte order from 1, 2, 3, 4, 5, 6, 7, 8 to 8, 7, 6, 5, 4, 3, 2, 1.
037         * @param d double to convert
038         * @return converted double
039         */
040        public static final double swapEndianess(final double d) {
041            return Double.longBitsToDouble(swapEndianess(Double.doubleToRawLongBits(d)));
042        }
043    
044        /** Convert a float.
045         * This method changes byte order from 1, 2, 3, 4 to 4, 3, 2, 1.
046         * @param f float to convert
047         * @return converted float
048         */
049        public static final float swapEndianess(final float f) {
050            return Float.intBitsToFloat(swapEndianess(Float.floatToRawIntBits(f)));
051        }
052    
053        /** Convert a long.
054         * This method changes byte order from 1, 2, 3, 4, 5, 6, 7, 8 to 8, 7, 6, 5, 4, 3, 2, 1.
055         * @param l long to convert
056         * @return converted long
057         */
058        @SuppressWarnings("OverlyComplexBooleanExpression")
059        public static final long swapEndianess(final long l) {
060            return
061                (l & 0x00000000000000FFL) <<  56 |
062                (l & 0x000000000000FF00L) <<  40 |
063                (l & 0x0000000000FF0000L) <<  24 |
064                (l & 0x00000000FF000000L) <<   8 |
065                (l & 0x000000FF00000000L) >>>  8 |
066                (l & 0x0000FF0000000000L) >>> 24 |
067                (l & 0x00FF000000000000L) >>> 40 |
068                (l & 0xFF00000000000000L) >>> 56;
069        }
070    
071        /** Convert an int.
072         * This method changes byte order from 1, 2, 3, 4 to 4, 3, 2, 1.
073         * @param i int to convert
074         * @return converted int
075         */
076        @SuppressWarnings("OverlyComplexBooleanExpression")
077        public static final int swapEndianess(final int i) {
078            return
079                (i & 0x000000FF) <<  24 |
080                (i & 0x0000FF00) <<   8 |
081                (i & 0x00FF0000) >>>  8 |
082                (i & 0xFF000000) >>> 24;
083        }
084    
085        /** Convert a char.
086         * This method swaps low and high byte.
087         * @param c char to convert
088         * @return converted char
089         */
090        public static final char swapEndianess(final char c) {
091            return (char)
092                ((c & 0x00FF) <<  8 |
093                 (c & 0xFF00) >>> 8);
094        }
095    
096        /** Convert a short.
097         * This method swaps low and high byte.
098         * @param s short to convert
099         * @return converted short
100         */
101        public static final short swapEndianess(final short s) {
102            return (short)
103                ((s & 0x00FF) <<  8 |
104                 (s & 0xFF00) >>> 8);
105        }
106    
107        /** Convert a byte.
108         * This method does nothing and exists for convenience only.
109         * @param b byte to convert
110         * @return converted byte (same as b)
111         */
112        public static final byte swapEndianess(final byte b) {
113            return b;
114        }
115    
116        /** Convert a boolean.
117         * This method does nothing and exists for convenience only.
118         * @param b boolean to convert
119         * @return converted boolean (same as b)
120         */
121        @SuppressWarnings({"BooleanMethodNameMustStartWithQuestion"})
122        public static final boolean swapEndianess(final boolean b) {
123            return b;
124        }
125    
126    } // class EndianConverter