package com.sonic.cow.client.rtc;

/**
 * @description:
 * @author: mzc
 * @date: 2025-08-01 14:29
 **/
/**
 * 兼容 Java 16 及以下版本的十六进制编码/解码工具类
 */
public class HexFormat {

    // 小写十六进制字符集
    private static final char[] LOWER_CASE_HEX = "0123456789abcdef".toCharArray();
    // 大写十六进制字符集
    private static final char[] UPPER_CASE_HEX = "0123456789ABCDEF".toCharArray();

    // 是否使用大写字母（默认小写）
    private final boolean upperCase;

    // 私有构造器，通过 of() 方法创建实例
    private HexFormat(boolean upperCase) {
        this.upperCase = upperCase;
    }

    /**
     * 创建默认的 HexFormat 实例（小写字母）
     */
    public static HexFormat of() {
        return new HexFormat(false);
    }

    /**
     * 创建使用大写字母的 HexFormat 实例
     */
    public static HexFormat ofUpperCase() {
        return new HexFormat(true);
    }

    /**
     * 将字节数组转换为十六进制字符串
     * @param bytes 输入字节数组（非空）
     * @return 十六进制字符串（长度为字节数组长度的2倍）
     */
    public String formatHex(byte[] bytes) {
        if (bytes == null) {
            throw new IllegalArgumentException("字节数组不能为null");
        }
        char[] hexChars = new char[bytes.length * 2];
        char[] hexTable = upperCase ? UPPER_CASE_HEX : LOWER_CASE_HEX;

        for (int i = 0; i < bytes.length; i++) {
            // 取字节的高4位（无符号）
            int high = (bytes[i] & 0xF0) >>> 4;
            // 取字节的低4位（无符号）
            int low = bytes[i] & 0x0F;
            // 转换为十六进制字符
            hexChars[i * 2] = hexTable[high];
            hexChars[i * 2 + 1] = hexTable[low];
        }
        return new String(hexChars);
    }

    /**
     * 将十六进制字符串转换为字节数组
     * @param hex 十六进制字符串（长度必须为偶数，仅包含0-9、a-f、A-F）
     * @return 字节数组
     */
    public byte[] parseHex(String hex) {
        if (hex == null || hex.length() % 2 != 0) {
            throw new IllegalArgumentException("十六进制字符串必须为非空且长度为偶数");
        }

        byte[] bytes = new byte[hex.length() / 2];
        for (int i = 0; i < bytes.length; i++) {
            // 截取每两个字符作为一个字节
            int start = i * 2;
            String hexByte = hex.substring(start, start + 2);
            // 转换为字节（16进制转10进制，再强转为byte）
            bytes[i] = (byte) Integer.parseInt(hexByte, 16);
        }
        return bytes;
    }
}
