Mega Code Archive

 
Categories / Java Tutorial / Development
 

Decodes values of attributes in the DN encoded in hex into a UTF-8 String

import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.naming.InvalidNameException; /*  *  Licensed to the Apache Software Foundation (ASF) under one  *  or more contributor license agreements.  See the NOTICE file  *  distributed with this work for additional information  *  regarding copyright ownership.  The ASF licenses this file  *  to you 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.   *    */ /**  * Various string manipulation methods that are more efficient then chaining  * string operations: all is done in the same buffer without creating a bunch of  * string objects.  *   * @author <a href="mailto:dev@labs.apache.org">Dungeon Project</a>  */ public class Main {   /** &lt;hex> ::= [0x30-0x39] | [0x41-0x46] | [0x61-0x66] */   private static final byte[] HEX_VALUE =       {            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 00 -> 0F           -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 10 -> 1F           -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 20 -> 2F            0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1, // 30 -> 3F ( 0, 1,2, 3, 4,5, 6, 7, 8, 9 )           -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 40 -> 4F ( A, B, C, D, E, F )           -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 50 -> 5F           -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1  // 60 -> 6F ( a, b, c, d, e, f )       };   /**    * Decodes values of attributes in the DN encoded in hex into a UTF-8     * String.  RFC2253 allows a DN's attribute to be encoded in hex.    * The encoded value starts with a # then is followed by an even     * number of hex characters.      */   public static final String decodeHexString( String str ) throws InvalidNameException   {       if ( str == null || str.length() == 0 )       {           throw new InvalidNameException( "Expected string to start with a '#' character.  " +               "Invalid hex encoded string for empty or null string."  );       }              char[] chars = str.toCharArray();       if ( chars[0] != '#' )       {           throw new InvalidNameException( "Expected string to start with a '#' character.  " +                   "Invalid hex encoded string: " + str  );       }              // the bytes representing the encoded string of hex       // this should be ( length - 1 )/2 in size       byte[] decoded = new byte[ ( chars.length - 1 ) >> 1 ];       for ( int ii = 1, jj = 0 ; ii < chars.length; ii+=2, jj++ )       {           int ch = ( HEX_VALUE[chars[ii]] << 4 ) +                HEX_VALUE[chars[ii+1]];           decoded[jj] = ( byte ) ch;       }              return utf8ToString( decoded );   }   /**    * Return an UTF-8 encoded String    *     * @param bytes    *            The byte array to be transformed to a String    * @return A String.    */   public static final String utf8ToString( byte[] bytes )   {       if ( bytes == null )       {           return "";       }       try       {           return new String( bytes, "UTF-8" );       }       catch ( UnsupportedEncodingException uee )       {           return "";       }   } }