commons-codec がバグってたので作成したユーティリティメソッドです。かなり昔のことなので今は直ってるかも知れませんが、何かのときのために・・
byte配列と2進数char配列の変換
/** * バイト配列から2進文字配列を作成して返却します。 * @param bytes 対象バイト配列 * @return 2進文字配列 */ public static char[] encodeBinary(byte[] bytes) { char [] ret = new char[bytes.length << 3]; for (int i = 0, j = 0; i < bytes.length; i++ ) { for (int mask = 0x80; mask >= 0x01; mask >>>= 1) { if ((bytes[i] & mask) == 0) ret[j++] = '0'; else ret[j++] = '1'; } } return ret; } /** * 2進文字配列からバイト配列を作成して返却します。 * @param chars 対象2進文字配列 * @return バイト配列 */ public static byte[] decodeBinary(char[] chars) { byte[] bytes = new byte[chars.length >> 3]; for (int i = 0, j = 0; i < bytes.length; i++ ) { for (int bit = 0x80; bit >= 0x01; bit >>>= 1) { if (chars[j++] == '1' ) { bytes[i] |= bit; } } } return bytes; }
byte配列と16進char配列の変換
/** 16進桁文字 */ private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; /** * バイト配列から16進文字配列を作成して返却します。 * @param bytes 対象バイト配列 * @return 16進文字配列 */ public static char[] encodeHex(byte[] bytes) { char [] ret = new char[bytes.length << 1]; for (int i = 0, j = 0; i < bytes.length; i++ ) { ret[j++] = HEX_DIGITS[bytes[i] >>> 4]; // 上位4bit ret[j++] = HEX_DIGITS[0x0F & bytes[i]]; // 下位4bit } return ret; } /** * 16進文字配列からバイト配列を作成して返却します。 * @param chars 対象16進文字配列 * @return バイト配列 */ public static byte[] decodeHex(char[] chars) { byte[] bytes = new byte[chars.length >> 1]; for (int i = 0, j = 0; i < bytes.length; i++) { int high = Character.digit(chars[j++], 16); // 上位4bit int low = Character.digit(chars[j++], 16); // 下位4bit if ( high == -1 || low == -1 ) throw new RuntimeException("Illegal hexadecimal charcter :" + chars[j-2] + chars[j-1] ); bytes[i] = (byte)((high << 4 ) | low); } return bytes; }
以上!!