// Copyright (C) 2011 - Will Glozer. All rights reserved.
package com.lambdaworks.codec;
/**
* High-performance base16 (AKA hex) codec.
*
* @author Will Glozer
*/
public class Base16 {
private static final char[] upper = "0123456789ABCDEF".toCharArray();
private static final char[] lower = "0123456789abcdef".toCharArray();
private static final byte[] decode = new byte[128];
static {
for (int i = 0; i < 10; i++) {
decode['0' + i] = (byte) i;
decode['A' + i] = (byte) (10 + i);
decode['a' + i] = (byte) (10 + i);
}
}
/**
* Encode bytes to base16 chars.
*
* @param src Bytes to encode.
* @param upper Use upper or lowercase chars.
*
* @return Encoded chars.
*/
public static char[] encode(byte[] src, boolean upper) {
char[] table = upper ? Base16.upper : Base16.lower;
char[] dst = new char[src.length * 2];
for (int si = 0, di = 0; si < src.length; si++) {
byte b = src[si];
dst[di++] = table[(b & 0xf0) >>> 4];
dst[di++] = table[(b & 0x0f)];
}
return dst;
}
/**
* Decode base16 chars to bytes.
*
* @param src Chars to decode.
*
* @return Decoded bytes.
*/
public static byte[] decode(char[] src) {
byte[] dst = new byte[src.length / 2];
for (int si = 0, di = 0; di < dst.length; di++) {
byte high = decode[src[si++] & 0x7f];
byte low = decode[src[si++] & 0x7f];
dst[di] = (byte) ((high << 4) + low);
}
return dst;
}
}