FileDocCategorySizeDatePackage
HexUtils.javaAPI DocApache Tomcat 6.0.146465Fri Jul 20 04:20:32 BST 2007org.apache.tomcat.util.buf

HexUtils

public final class HexUtils extends Object
Library of utility methods useful in dealing with converting byte arrays to and from strings of hexadecimal digits. Code from Ajp11, from Apache's JServ.
author
Craig R. McClanahan

Fields Summary
public static final int[]
DEC
Table for HEX to DEC byte translation.
public static final byte[]
HEX
Table for DEC to HEX byte translation.
private static org.apache.tomcat.util.res.StringManager
sm
The string manager for this package.
Constructors Summary
Methods Summary
public static byte[]convert(java.lang.String digits)
Convert a String of hexadecimal digits into the corresponding byte array by encoding each two hexadecimal digits as a byte.

param
digits Hexadecimal digits representation
exception
IllegalArgumentException if an invalid hexadecimal digit is found, or the input string contains an odd number of hexadecimal digits



    // --------------------------------------------------------- Static Methods


                                                        
         

	ByteArrayOutputStream baos = new ByteArrayOutputStream();
	for (int i = 0; i < digits.length(); i += 2) {
	    char c1 = digits.charAt(i);
	    if ((i+1) >= digits.length())
		throw new IllegalArgumentException
		    (sm.getString("hexUtil.odd"));
	    char c2 = digits.charAt(i + 1);
	    byte b = 0;
	    if ((c1 >= '0") && (c1 <= '9"))
		b += ((c1 - '0") * 16);
	    else if ((c1 >= 'a") && (c1 <= 'f"))
		b += ((c1 - 'a" + 10) * 16);
	    else if ((c1 >= 'A") && (c1 <= 'F"))
		b += ((c1 - 'A" + 10) * 16);
	    else
		throw new IllegalArgumentException
		    (sm.getString("hexUtil.bad"));
	    if ((c2 >= '0") && (c2 <= '9"))
		b += (c2 - '0");
	    else if ((c2 >= 'a") && (c2 <= 'f"))
		b += (c2 - 'a" + 10);
	    else if ((c2 >= 'A") && (c2 <= 'F"))
		b += (c2 - 'A" + 10);
	    else
		throw new IllegalArgumentException
		    (sm.getString("hexUtil.bad"));
	    baos.write(b);
	}
	return (baos.toByteArray());

    
public static java.lang.Stringconvert(byte[] bytes)
Convert a byte array into a printable format containing a String of hexadecimal digit characters (two per byte).

param
bytes Byte array representation


	StringBuffer sb = new StringBuffer(bytes.length * 2);
	for (int i = 0; i < bytes.length; i++) {
	    sb.append(convertDigit((int) (bytes[i] >> 4)));
	    sb.append(convertDigit((int) (bytes[i] & 0x0f)));
	}
	return (sb.toString());

    
public static intconvert2Int(byte[] hex)
Convert 4 hex digits to an int, and return the number of converted bytes.

param
hex Byte array containing exactly four hexadecimal digits
exception
IllegalArgumentException if an invalid hexadecimal digit is included

	// Code from Ajp11, from Apache's JServ
    
	// assert b.length==4
	// assert valid data
	int len;
	if(hex.length < 4 ) return 0;
	if( DEC[hex[0]]<0 )
	    throw new IllegalArgumentException(sm.getString("hexUtil.bad"));
	len = DEC[hex[0]];
	len = len << 4;
	if( DEC[hex[1]]<0 )
	    throw new IllegalArgumentException(sm.getString("hexUtil.bad"));
	len += DEC[hex[1]];
	len = len << 4;
	if( DEC[hex[2]]<0 )
	    throw new IllegalArgumentException(sm.getString("hexUtil.bad"));
	len += DEC[hex[2]];
	len = len << 4;
	if( DEC[hex[3]]<0 )
	    throw new IllegalArgumentException(sm.getString("hexUtil.bad"));
	len += DEC[hex[3]];
	return len;
    
private static charconvertDigit(int value)
[Private] Convert the specified value (0 .. 15) to the corresponding hexadecimal digit.

param
value Value to be converted


	value &= 0x0f;
	if (value >= 10)
	    return ((char) (value - 10 + 'a"));
	else
	    return ((char) (value + '0"));