1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.util.encoders; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.ByteArrayOutputStream; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException; 5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.OutputStream; 6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class Hex 8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private static final Encoder encoder = new HexEncoder(); 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * encode the input data producing a Hex encoded byte array. 13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @return a byte array containing the Hex encoded data. 15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static byte[] encode( 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] data) 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return encode(data, 0, data.length); 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * encode the input data producing a Hex encoded byte array. 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @return a byte array containing the Hex encoded data. 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static byte[] encode( 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] data, 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int off, 30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int length) 31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam try 35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam encoder.encode(data, off, length, bOut); 37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam catch (IOException e) 39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new RuntimeException("exception encoding Hex string: " + e); 41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return bOut.toByteArray(); 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * Hex encode the byte data writing it to the given output stream. 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @return the number of bytes produced. 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static int encode( 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] data, 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam OutputStream out) 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return encoder.encode(data, 0, data.length, out); 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * Hex encode the byte data writing it to the given output stream. 61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @return the number of bytes produced. 63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static int encode( 65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] data, 66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int off, 67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam int length, 68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam OutputStream out) 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return encoder.encode(data, off, length, out); 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * decode the Hex encoded input data. It is assumed the input data is valid. 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @return a byte array representing the decoded data. 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static byte[] decode( 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] data) 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam try 85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam encoder.decode(data, 0, data.length, bOut); 87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam catch (IOException e) 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new RuntimeException("exception decoding Hex string: " + e); 91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return bOut.toByteArray(); 94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * decode the Hex encoded String data - whitespace will be ignored. 98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @return a byte array representing the decoded data. 100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static byte[] decode( 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam String data) 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam try 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam encoder.decode(data, bOut); 109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam catch (IOException e) 111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new RuntimeException("exception decoding Hex string: " + e); 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return bOut.toByteArray(); 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * decode the Hex encoded String data writing it to the given output stream, 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * whitespace characters will be ignored. 121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @return the number of bytes produced. 123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static int decode( 125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam String data, 126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam OutputStream out) 127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throws IOException 128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return encoder.decode(data, out); 130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 132