Mega Code Archive

 
Categories / Java / File Input Output
 

Byte-Array Conversion Utility Functions

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