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 
 
    
     
     
     
     
     
     
  
  |