天天看点

二进制字节数组与十六进制字符串间的转换

聽聽聽聽聽聽聽鍦ㄥ姞瀵嗙畻娉曚腑锛岀粡甯镐細閬囧埌灏嗗姞瀵嗗悗寰楀埌鐨勪簩杩涘埗瀛楄妭鏁扮粍杞?6杩涘埗瀛楃涓插悗杩斿洖锛涘湪瑙e瘑绠楁硶涓紝鍒欓渶瑕佸皢瀛楃涓茶浆浜岃繘鍒剁劧鍚庤В瀵嗭紱涓嬮潰灏嗗垪涓惧父鐢ㄧ殑鍑犵杞崲鏂规硶锛屽湪鏂囨湯浼氱粰鍑哄嚑绉嶅父鐢ㄥ姞瑙e瘑绠楁硶绀轰緥銆?

聽聽聽聽聽 聽 1銆佷簩杩涘埗鏁扮粍杞崄鍏繘鍒?

/**
     * 灏嗕簩杩涘埗杞垚16杩涘埗锛屽姞瀵嗘椂鐢?鏂瑰紡涔嬩竴)
     *
     * @param bytes 鍔犲瘑寰楀埌鐨勪簩杩涘埗瀛楄妭鏁扮粍
     * @return
     */
    public static String parseBytes2Hex(byte[] bytes) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(bytes[i] & 0xFF);
            if (hex.length() == 1) {
                hex = "0" + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }
           

璇ョ鏂瑰紡鏄渶瑕侀亶鍘嗗瓧鑺傛暟缁勶紝鐒跺悗杩涜涓庤繍绠楀悗杞?6杩涘埗瀛楃涓诧紝涔嬪悗鎷兼帴銆傜浜岀鏂瑰紡鍘熺悊涓婄浉浼硷紝涓嶈繃閲囩敤鐨勬槸瀛楃鏍煎紡澶勭悊锛岄伩鍏嶈ˉ0鎿嶄綔锛屾洿涓洪珮鏁堬紝濡備笅鎵€绀猴細

/**
     * 灏嗕簩杩涘埗杞负16杩涘埗瀛楃涓?StringBuilder鍗曠嚎绋嬪畨鍏?鏁堢巼楂?鎺ㄨ崘)
     * @param bytes
     * @return
     */
    public static String toHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }
           

2銆?6杩涘埗瀛楃涓茶浆浜岃繘鍒舵暟缁?

/**
     * 灏?6杩涘埗涓茶浆鎴愪簩杩涘埗鏁扮粍锛岀敤浜庤В瀵?鏂瑰紡1)
     *
     * @param hexStr
     * @return
     */
    public static byte[] parseHexStr2bytes(String hexStr) {
        if (hexStr.length() < 1) {
            return null;
        }
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < result.length; i++) {
            int high = Integer.parseInt(hexStr.substring(2 * i, 2 * i + 1), 16);
            int low = Integer.parseInt(hexStr.substring(2 * i + 1, 2 * i + 2), 16);
            result[i] = (byte)(high * 16 + low);
        }
        return result;
    }

    /**
     * 灏?6杩涘埗瀛楃涓茶浆涓轰簩杩涘埗鏁版嵁(鏂瑰紡2)
     *
     * @param strIn
     * @return
     * @throws Exception
     */
    public static byte[] hexStr2ByteArr(String strIn) throws Exception {
        byte[] bytes = strIn.getBytes();
        int length = bytes.length;
        byte[] outs = new byte[length / 2];
        int skip = 2;
        for (int i = 0; i < length; i = i + skip) {
            String tmp = new String(bytes, i, 2);
            outs[i / 2] = (byte)Integer.parseInt(tmp, 16);
        }
        return outs;
    }

    /**
     * 16杩涘埗鍔犲瘑涓茶浆浜岃繘鍒舵暟鎹?鏂瑰紡3)-鎺ㄨ崘
     */
    public static byte[] decodeHex(String encryptedHexString) throws Exception{
        return Hex.decodeHex(encryptedHexString.toCharArray());
    }
           

绗竴绗簩绉嶈浆鎹㈡柟寮忕浉褰撲簬涓婅堪浜岃繘鍒惰浆16杩涘埗鐨勯€嗘搷浣滐紝浠庡啓娉曚笂鍜岀悊瑙d笂姣旇緝闅炬噦銆傝繖閲屾帹鑽愮涓夌鏂瑰紡锛氳鏂瑰紡鏄埄鐢╟ommons-codec鍖呬腑鐨勬彁渚涚殑鏂规硶鐩存帴杩涜杞崲銆?

涓嬮潰鏄疉ES鍜孊ASE64鍔犺В瀵嗙殑绠€鍗曠畻娉曠ず渚嬶細

public class EncryptUtils {

    private static final String CHARSET = "gbk";

    /**
     * 涓嶅彲閫嗗姞瀵嗙畻娉曪細MD5
     * 瀵圭О鍔犲瘑绠楁硶:AES(鏇村畨鍏?涓嶥ES
     * 鍔犲瘑杩囩▼鏄皢寰楀埌鐨勪簩杩涘埗瀛楄妭鏁版嵁杞垚16杩涘埗骞跺緱鍒板瓧绗︿覆
     *
     * @param str 寰呭姞瀵嗕覆
     * @param key 绉橀挜
     * @return 鍔犲瘑鍚庣殑瀛楃涓?     * @throws Exception
     */
    public static byte[] aesEncrypt(String str, String key) throws Exception {
        if (str == null || key == null) {
            return null;
        }
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(CHARSET), "AES"));
        byte[] bytes = cipher.doFinal(str.getBytes(CHARSET));
        return bytes;
    }

    /**
     * 鍔犲瘑寰楀埌16杩涘埗瀛楃涓?     * @param data
     * @param password
     * @return
     */
    public static String encryptToHexString(String data, String password) throws Exception{
        return toHex(aesEncrypt(data, password));
    }

    /**
     * AES瑙e瘑
     * 瑙e瘑杩囩▼鏄皢16杩涘埗瀛楃涓插厛杞垚浜岃繘鍒跺瓧鑺傛暟缁勶紝鐒跺悗鎵ц瑙e瘑鎿嶄綔
     *
     * @param str 甯﹁В瀵嗙殑瀛楃涓?     * @param key 绉橀挜
     * @return 鍘熶覆
     */
    public static String aesDecrypt(String str, String key) throws Exception {
        if (str == null || key == null) {
            return null;
        }
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes(CHARSET), "AES"));
        byte[] strBytes = decodeHex(str);
        byte[] bytes = cipher.doFinal(strBytes);
        return new String(bytes, CHARSET);
    }

    /**
     * 灏嗕簩杩涘埗杞负16杩涘埗瀛楃涓?StringBuilder鍗曠嚎绋嬪畨鍏?鏁堢巼楂?鎺ㄨ崘)
     * @param bytes
     * @return
     */
    public static String toHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }

    /**
     * 16杩涘埗鍔犲瘑涓茶浆浜岃繘鍒舵暟鎹?鏂瑰紡3)-鎺ㄨ崘
     */
    public static byte[] decodeHex(String encryptedHexString) throws Exception{
        return Hex.decodeHex(encryptedHexString.toCharArray());
    }

    /**
     * base64鍔犲瘑锛屼骇鐢熺殑瀛楄妭浣嶆暟鏄?鐨勫€嶆暟锛屼笉瓒充綅鈥?鈥濆~鍏?     * <p>base64鍔犺В瀵嗗睘浜庝竴绉嶇紪鐮佹牸寮忥紝涓嶆槸涓ユ牸鎰忎箟涓婄殑鍔犲瘑绠楁硶</p>
     *
     * @param str
     * @return
     */
    public static String base64Encrypt(String str) throws Exception {
        byte[] bytes = str.getBytes(CHARSET);
        BASE64Encoder base64Encoder = new BASE64Encoder();
        return base64Encoder.encodeBuffer(bytes);
    }

    /**
     * base64瑙e瘑锛岀敓鎴愬瓧鑺傛暟缁?     * <p>new String():鏍规嵁鍙傛暟鏄瓧鑺傛暟缁勶紝瑙g爜涓哄搴斿瓧绗?lt;/p>
     * <p>toString():鎵撳嵃瀵硅薄锛宧ash鐮?lt;/p>
     *
     * @param key
     * @return
     * @throws Exception
     */
    public static String base64Decrypt(String key) throws Exception {
        BASE64Decoder base64Decoder = new BASE64Decoder();
        byte[] bytes = base64Decoder.decodeBuffer(key);
        return new String(bytes, CHARSET);
    }

    public static void main(String[] args) throws Exception {
        //base64鍔犺В瀵?        String base64EncryptStr = base64Encrypt("寮犱笁");
        System.out.println(base64EncryptStr);
        String base64DecryptStr = base64Decrypt(base64EncryptStr);
        System.out.println(base64DecryptStr);

        //AES鍔犲瘑,杞?6杩涘埗娴嬭瘯
        byte[] bytes = aesEncrypt("zhangsan", "*(&^!#$^#@2f%&9$");
        String hexStr2 = toHex(bytes);
        System.out.println(hexStr2);
        //AES瑙e瘑
        String decryptStr = aesDecrypt(hexStr2, "*(&^!#$^#@2f%&9$");
        System.out.println(decryptStr);
    }
}