There were 2 small issues here. Both performance related, but I assume that this method createFromHexString is called a lot.
These are not bugs. >From this article: http://www.javaworld.com/javaworld/jw-04-1997/jw-04-optimize.html?page=5 Comparing against zero is almost always more efficient in any language since the underlying tests are based on < 0,<= 0, == 0, != 0, >= 0 and > 0. package org.apache.pdfbox.cos; // original code. public static COSString createFromHexString( String hex ) throws IOException COSString retval = new COSString(); StringBuffer hexBuffer = new StringBuffer( hex.trim() ); //if odd number then the last hex digit is assumed to be 0 if( hexBuffer.length() % 2 == 1 ) { hexBuffer.append( "0" ); } for( int i=0; i<hexBuffer.length();) { // Same code with 3 small changes applied. // test for null optional, since it should never happen // compare to zero instead of 1 // added loop invariant variable hexBufferLength public static COSString createFromHexString( String hex ) throws IOException COSString retval = new COSString(); // should you add a test for null here? if (hex == null) // this should never happen return null; // or return retval; // ?? StringBuffer hexBuffer = new StringBuffer( hex.trim() ); // slightly changed code to improve effiency of the loop. int hexBufferLength= hexBuffer.length(); if( hexBufferLength % 2 != 0 ) // add comparison against zero values of mod 2 can only be 0 or 1 { hexBuffer.append( "0" ); } // hexBuffer.length() is a loop invariant, and will not change within the loop, // calling the method on each iteration is not efficient. // better to create a local variable and reference it at the top of the loop. for( int i=0; i<hexBufferLength;) {
