/*
* Copyright (c) 2014 the original author or authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.werval.util;
/**
* Hexadecimal codec.
*/
public final class Hex
{
private static final char[] HEX_DIGITS =
{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
public static byte[] decode( CharSequence data )
{
return decode( data.toString().toCharArray() );
}
public static byte[] decode( char[] data )
{
int len = data.length;
if( ( len & 0x01 ) != 0 )
{
throw new IllegalArgumentException( " Odd number of characters in hexadecimal encoded." );
}
byte[] out = new byte[ len >> 1 ];
// two characters form the hex value.
for( int i = 0, j = 0; j < len; i++ )
{
int f = toDigit( data[j], j ) << 4;
j++;
f |= toDigit( data[j], j );
j++;
out[i] = (byte) ( f & 0xFF );
}
return out;
}
public static String encode( byte[] data )
{
int l = data.length;
char[] out = new char[ l << 1 ];
// two characters form the hex value.
for( int i = 0, j = 0; i < l; i++ )
{
out[j++] = HEX_DIGITS[( 0xF0 & data[i] ) >>> 4];
out[j++] = HEX_DIGITS[ 0x0F & data[i]];
}
return new String( out );
}
private static int toDigit( char ch, int index )
{
int digit = Character.digit( ch, 16 );
if( digit == -1 )
{
throw new IllegalArgumentException( "Illegal hexadecimal character " + ch + " at index " + index );
}
return digit;
}
private Hex()
{
}
}