title: Converting a Hex String to an image file
body: <p>I have a requirement to read a Hex String with leading zeros which represents a JPEG file, from an xml file received and save it as an image file. The image data looks like</p>
  
  <pre><code>0000005000000050FF191818FF151715FF111413FF0E1...........................FF2A2322FF292221
  </code></pre>
  
  <p>In xml file The length of String between the tag is 51216 I read the Hex data in between the Photo tag as a String and Converted it to a byte[], and the using a <code>FileOutputStream</code> I am writing to a file. But when I try to open the image file it tells "the file appears to be damaged,corrupted or file is too large" I have tried many methods to save the image, but no success. I am listing the methods used below. Please help me out from this.</p>
  
  <pre><code>String photo="0000005000000050FF191818FF15"; //this is just a sample.The photo String actually contains the full Hex String which is 51216 long
  //METHOD 1
      String[] v = photo.split(" ");
      byte[] arr = new byte[v.length];
      int x = 0;
      for(String val: v) {
          arr[x++] =  Integer.decode("0x" + val).byteValue();
  
      }
       FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(arr);
      fos.flush();
      fos.close();
  
  
    //METHOD 2
      byte[] arr = new byte[photo.length()/2];
      for ( int start = 0; start &lt; photo.length(); start += 2 )
      {
          String thisByte = photo.substring(start, start+2);
          arr[start/2] = Byte.parseByte(thisByte, 16);
      }
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(arr);
      fos.flush();
      fos.close();
  
  
    //METHOD 3
      if ((photo.length() % 2) != 0)
          throw new IllegalArgumentException("Input string must contain an even number of characters");
  
      final byte result[] = new byte[photo.length()/2];
      final char enc[] = photo.toCharArray();
      for (int x = 0; x &lt; enc.length; x += 2) 
      {
          StringBuilder curr = new StringBuilder(2);
          curr.append(enc[x]).append(enc[x + 1]);
          result[x/2] = (byte) Integer.parseInt(curr.toString(), 16);
      }
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(result);
      fos.flush();
      fos.close();
  
  
    //METHOD 4
      byte result[] = new byte[photo.length()/2];
      char enc[] = photo.toUpperCase().toCharArray();
      StringBuffer curr;
      for (int x = 0; x &lt; enc.length; x += 2) 
      {
          curr = new StringBuffer("");
          curr.append(String.valueOf(enc[x]));
          curr.append(String.valueOf(enc[x + 1]));
          result[x] = (byte) Integer.parseInt(curr.toString(), 16);
      }
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(result);
      fos.flush();
      fos.close();
  
  
    //METHOD 5
      int len = photo.length();
      byte[] data = new byte[len / 2];
      for (int x = 0; x &lt; len; x += 2)
      {
          data[x / 2] = (byte) ((Character.digit(photo.charAt(x), 16) &lt;&lt; 4)
                               + Character.digit(photo.charAt(x+1), 16));
      }
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(data);
      fos.flush();
      fos.close();
  
  
    //METHOD 6
      byte[] bytes=new BigInteger(photo, 16).toByteArray();
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(bytes);
      fos.flush();
      fos.close();
  
  
    //METHOD 7
      byte[] bytes =DatatypeConverter.parseHexBinary(photo);
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(bytes);
      fos.flush();
      fos.close();
  
  
    //METHOD 8
       HexBinaryAdapter adapter = new HexBinaryAdapter();
      byte[] bytes = adapter.unmarshal(photo);
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.png");
      fos.write(bytes);
      fos.flush();
      fos.close();
  
  
    //METHOD 9
      byte data[] = new byte[photo.length()/2];
      for(int x=0;i &lt; photo.length();x+=2) {
          data[x/2] = (Integer.decode("0x"+photo.charAt(x)+photo.charAt(x+1))).byteValue();
      }
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(data);
      fos.flush();
      fos.close();
  
  
    //METHOD 10
      byte[] data = new byte[photo.length()/2];
      for (int x=0;i&lt;photo.length()/2;x++) 
      {
          data[x] = (Integer.decode(
                  "0x"+photo.substring(x*2, (x+1)*2))).byteValue();
      }
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(data);
      fos.flush();
      fos.close();
  
  
    //METHOD 11
      String hexVal ="0000005000000050FF";
      //String hexVal = "0123456789ABCDEF";
      byte[] out = new byte[photo.length() / 2];
      int n = photo.length();
      for( int x = 0; x &lt; n; x += 2 ) {
          int hn = hexVal.indexOf( photo.charAt( x ) );
          int ln = hexVal.indexOf( photo.charAt( x + 1 ) );
  
          out[x/2] = (byte)( ( hn &lt;&lt; 4 ) | ln );
      }
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(out);
      fos.flush();
      fos.close();
  
  
  
      //METHOD 12
       byte[] array=photo.getBytes();
       FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(array);
      fos.flush();
      fos.close();
  
  
      //METHOD 13
      byte[] array=photo.getBytes();
      byte[] bytes = Base64.decode(array);
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(bytes);
      fos.flush();
      fos.close();
  
  
      //METHOD 14
      byte[] array=photo.getBytes();
      Charset csets = Charset.forName("UTF-8");
      ByteBuffer bb=ByteBuffer.wrap(array);
      csets.decode(bb);
      bb.rewind();
      byte[] array1=bb.array();
      FileOutputStream fos=new FileOutputStream("D:/Images/image6.jpg");
      fos.write(array1);
      fos.flush();
      fos.close();
  </code></pre>