ByteUtils.java Source code

Java tutorial

Introduction

Here is the source code for ByteUtils.java

Source

import java.io.UnsupportedEncodingException;

/**
 * <p>Byte-Array Conversion Utility Functions.</p>
 *
 * $Id: ByteUtils.java,v 1.6 2005/06/16 19:58:58 mokhov Exp $
 *
 * @version $Revision: 1.6 $
 * @author Serguei Mokhov
 * @since 0.3.0
 */
public class ByteUtils {
    /**
     * Allow derivatives.
     */
    protected ByteUtils() {
    }

    /**
     * Converts a byte array to short value.
     * Equivalent to byteArrayToShort(paRawBytes, 0, pbBigEndian);
     *
     * @param paRawBytes the byte array
     * @param pbBigEndian true if the bytes are in Big-endian order; false otherwise
     *
     * @return short representation of the bytes
     */
    public static short byteArrayToShort(byte[] paRawBytes, boolean pbBigEndian) {
        return byteArrayToShort(paRawBytes, 0, pbBigEndian);
    }

    /**
     * Converts a portion of a byte array with given offset to short value.
     *
     * @param paRawBytes the byte array
     * @param piOffset offset in the original array to start reading bytes from
     * @param pbBigEndian true if the bytes are in Big-endian order; false otherwise
     *
     * @return short representation of the bytes
     */
    public static short byteArrayToShort(byte[] paRawBytes, int piOffset, boolean pbBigEndian) {
        int iRetVal = -1;

        // TODO: revisit this: should we silently add missing byte and should
        // we ingnore excessing bytes?
        if (paRawBytes.length < piOffset + 2)
            return -1;

        int iLow;
        int iHigh;

        if (pbBigEndian) {
            iLow = paRawBytes[piOffset + 1];
            iHigh = paRawBytes[piOffset + 0];
        } else {
            iLow = paRawBytes[piOffset + 0];
            iHigh = paRawBytes[piOffset + 1];
        }

        // Merge high-order and low-order byte to form a 16-bit double value.
        iRetVal = (iHigh << 8) | (0xFF & iLow);

        return (short) iRetVal;
    }

    /**
     * Converts a byte array to int value.
     * Equivalent to intArrayToShort(paRawBytes, 0, pbBigEndian);
     *
     * @param paRawBytes the byte array
     * @param pbBigEndian true if the bytes are in Big-endian order; false otherwise
     *
     * @return int representation of the bytes
     */
    public static int byteArrayToInt(byte[] paRawBytes, boolean pbBigEndian) {
        return byteArrayToInt(paRawBytes, 0, pbBigEndian);
    }

    /**
     * Converts a portion of a byte array with given offset to int value.
     *
     * @param paRawBytes the byte array
     * @param piOffset offset in the original array to start reading bytes from
     * @param pbBigEndian true if the bytes are in Big-endian order; false otherwise
     *
     * @return int representation of the bytes
     */
    public static int byteArrayToInt(byte[] paRawBytes, int piOffset, boolean pbBigEndian) {
        int iRetVal = -1;

        if (paRawBytes.length < piOffset + 4)
            return iRetVal;

        int iLowest;
        int iLow;
        int iMid;
        int iHigh;

        if (pbBigEndian) {
            iLowest = paRawBytes[piOffset + 3];
            iLow = paRawBytes[piOffset + 2];
            iMid = paRawBytes[piOffset + 1];
            iHigh = paRawBytes[piOffset + 0];
        } else {
            iLowest = paRawBytes[piOffset + 0];
            iLow = paRawBytes[piOffset + 1];
            iMid = paRawBytes[piOffset + 2];
            iHigh = paRawBytes[piOffset + 3];
        }

        // Merge four bytes to form a 32-bit int value.
        iRetVal = (iHigh << 24) | (iMid << 16) | (iLow << 8) | (0xFF & iLowest);

        return iRetVal;
    }

    /**
     * Converts an int value to a byte array.
     *
     * @param piValueToConvert the original integer
     * @param pbBigEndian true if the bytes are in Big-endian order; false otherwise
     *
     * @return byte[] representation of the int
     */
    public static byte[] intToByteArray(int piValueToConvert, boolean pbBigEndian) {
        byte[] aRetVal = new byte[4];

        byte iLowest;
        byte iLow;
        byte iMid;
        byte iHigh;

        iLowest = (byte) (piValueToConvert & 0xFF);
        iLow = (byte) ((piValueToConvert >> 8) & 0xFF);
        iMid = (byte) ((piValueToConvert >> 16) & 0xFF);
        iHigh = (byte) ((piValueToConvert >> 24) & 0xFF);

        if (pbBigEndian) {
            aRetVal[3] = iLowest;
            aRetVal[2] = iLow;
            aRetVal[1] = iMid;
            aRetVal[0] = iHigh;
        } else {
            aRetVal[0] = iLowest;
            aRetVal[1] = iLow;
            aRetVal[2] = iMid;
            aRetVal[3] = iHigh;
        }

        return aRetVal;
    }

    /**
     * Converts a byte array to String value.
     * Cleans up non-word characters along the way.
     *
     * Equivalent to byteArrayToString(paRawBytes, 0, paRawBytes.length);
     *
     * @param paRawBytes the byte array, non-UNICODE
     *
     * @return UNICODE String representation of the bytes
     */
    public static String byteArrayToString(byte[] paRawBytes) {
        return byteArrayToString(paRawBytes, 0, paRawBytes.length);
    }

    /**
     * Converts a portion of a byte array to String value.
     * Cleans up non-word characters along the way.
     *
     * @param paRawBytes the byte array, non-UNICODE
     * @param piOffset offset in the original array to start reading bytes from
     * @param piLength how many bytes of the array paramter to interpret as String
     *
     * @return UNICODE String representation of the bytes with trailing garbage stripped;
     *         "" if array length is less than piOffset + piLength;
     *         "" if the generatied string begins with garbage
     */
    public static String byteArrayToString(byte[] paRawBytes, int piOffset, int piLength) {
        if (paRawBytes.length < piOffset + piLength)
            return "";

        String oBeautifulString = new String(paRawBytes, piOffset, piLength);
        int i = 0;

        if (oBeautifulString.matches("^\\W") == true)
            oBeautifulString = "";
        else {
            for (i = piOffset; i < piOffset + piLength; i++) {
                if (paRawBytes[i] < 32 || paRawBytes[i] > 128)
                    break;
            }

            oBeautifulString = oBeautifulString.substring(0, i - piOffset);
        }

        return oBeautifulString;
    }

    /**
     * Converts a String value to a byte array in US-ASCII charset.
     *
     * Equivalent to stringToByteArray(pstrStringToConvert, "US-ASCII");
     *
     * @param pstrStringToConvert the original string
     *
     * @return null-terminated byte[] representation of the String
     */
    public static byte[] stringToByteArray(String pstrStringToConvert) {
        return stringToByteArray(pstrStringToConvert, "US-ASCII");
    }

    /**
     * Attempts to convert a String value to a byte array in specified charset.
     * If the charset is invalid, returns plain byte-representation of the host environment.
     *
     * @param pstrStringToConvert the original string
     * @param pstrCharSet characted set to assume for the original string
     *
     * @return null-terminated byte[] representation of the String
     */
    public static byte[] stringToByteArray(String pstrStringToConvert, String pstrCharSet) {
        byte[] aRecordData = null;

        try {
            aRecordData = (pstrStringToConvert + '\0').getBytes(pstrCharSet);
        } catch (UnsupportedEncodingException e) {
            System.err.println("WARNING: " + e);
            aRecordData = (pstrStringToConvert + '\0').getBytes();
        }

        return aRecordData;
    }

    /**
    * Returns source code revision information.
    * @return revision string
    */
    public static String getMARFSourceCodeRevision() {
        return "$Revision: 1.6 $";
    }
}

// EOF