diff options
Diffstat (limited to 'src/org/xbill/DNS/utils/base16.java')
-rw-r--r-- | src/org/xbill/DNS/utils/base16.java | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/org/xbill/DNS/utils/base16.java b/src/org/xbill/DNS/utils/base16.java new file mode 100644 index 0000000..58024e6 --- /dev/null +++ b/src/org/xbill/DNS/utils/base16.java @@ -0,0 +1,73 @@ +// Copyright (c) 1999-2004 Brian Wellington (bwelling@xbill.org) + +package org.xbill.DNS.utils; + +import java.io.*; + +/** + * Routines for converting between Strings of hex-encoded data and arrays of + * binary data. This is not actually used by DNS. + * + * @author Brian Wellington + */ + +public class base16 { + +private static final String Base16 = "0123456789ABCDEF"; + +private +base16() {} + +/** + * Convert binary data to a hex-encoded String + * @param b An array containing binary data + * @return A String containing the encoded data + */ +public static String +toString(byte [] b) { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + + for (int i = 0; i < b.length; i++) { + short value = (short) (b[i] & 0xFF); + byte high = (byte) (value >> 4); + byte low = (byte) (value & 0xF); + os.write(Base16.charAt(high)); + os.write(Base16.charAt(low)); + } + return new String(os.toByteArray()); +} + +/** + * Convert a hex-encoded String to binary data + * @param str A String containing the encoded data + * @return An array containing the binary data, or null if the string is invalid + */ +public static byte [] +fromString(String str) { + ByteArrayOutputStream bs = new ByteArrayOutputStream(); + byte [] raw = str.getBytes(); + for (int i = 0; i < raw.length; i++) { + if (!Character.isWhitespace((char)raw[i])) + bs.write(raw[i]); + } + byte [] in = bs.toByteArray(); + if (in.length % 2 != 0) { + return null; + } + + bs.reset(); + DataOutputStream ds = new DataOutputStream(bs); + + for (int i = 0; i < in.length; i += 2) { + byte high = (byte) Base16.indexOf(Character.toUpperCase((char)in[i])); + byte low = (byte) Base16.indexOf(Character.toUpperCase((char)in[i+1])); + try { + ds.writeByte((high << 4) + low); + } + catch (IOException e) { + } + } + return bs.toByteArray(); +} + +} |