読者です 読者をやめる 読者になる 読者になる

byte 配列の変換メソッド


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;
    }


以上!!