001/* 002 Licensed to the Apache Software Foundation (ASF) under one 003 or more contributor license agreements. See the NOTICE file 004 distributed with this work for additional information 005 regarding copyright ownership. The ASF licenses this file 006 to you under the Apache License, Version 2.0 (the 007 "License"); you may not use this file except in compliance 008 with the License. You may obtain a copy of the License at 009 010 http://www.apache.org/licenses/LICENSE-2.0 011 012 Unless required by applicable law or agreed to in writing, 013 software distributed under the License is distributed on an 014 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 KIND, either express or implied. See the License for the 016 specific language governing permissions and limitations 017 under the License. 018 */ 019 020package org.apache.wiki.util; 021 022/** 023 * A collection of static byte utility methods. 024 * 025 * @author Ichiro Furusato 026 */ 027public class ByteUtils 028{ 029 private static final char[] hexArray = "0123456789abcdef".toCharArray(); 030 031 032 /** 033 * byte[] array to hex conversion. Note that this provides 034 * no delimiters; the bytes are simply concatenated. 035 */ 036 public static String bytes2hex(final byte[] bytes ) 037 { 038 final char[] ca = new char[bytes.length * 2]; 039 for ( int i = 0; i < bytes.length; i++ ) { 040 final int v = bytes[i] & 0xff; 041 ca[i * 2] = hexArray[v >>> 4]; 042 ca[i * 2 + 1] = hexArray[v & 0x0f]; 043 } 044 return new String(ca); 045 } 046 047 048 /** 049 * byte to hex conversion. 050 */ 051 public static String byte2hex(final byte b ) 052 { 053 return Integer.toHexString(b & 0xff); 054 } 055 056 057 /** 058 * Parses a hexadecimal string into its corresponding bytes. 059 */ 060 public static byte[] parseHexBinary(final String hex ) 061 { 062 final int len = hex.length(); 063 // e.g., "111" is not a valid hex encoding. 064 if( len%2 != 0 ) { 065 throw new IllegalArgumentException("hexBinary needs to be even-length: "+hex); 066 } 067 final byte[] out = new byte[len/2]; 068 for( int i = 0; i < len; i+=2 ) { 069 final int h = hexToBin(hex.charAt(i)); 070 final int l = hexToBin(hex.charAt(i+1)); 071 if ( h==-1 || l==-1 ) { 072 throw new IllegalArgumentException("contains illegal character for hexBinary: "+hex); 073 } 074 out[i/2] = (byte)(h*16+l); 075 } 076 return out; 077 } 078 079 080 /** 081 * Converts a single hex character into its integer equivalent. 082 */ 083 public static int hexToBin(final char c ) 084 { 085 if ( '0'<=c && c<='9' ) return c-'0'; 086 if ( 'A'<=c && c<='F' ) return c-'A'+10; 087 if ( 'a'<=c && c<='f' ) return c-'a'+10; 088 return -1; 089 } 090 091 092 private ByteUtils() {} 093 094}