package com.njcn.gather.tool.wave.utils;

/**
 * 波形二进制数据转换工具。
 */
public final class BitConverter {

    private BitConverter() {
    }

    /**
     * 将两个字节转换为无符号 short。
     *
     * @param bytes 字节数组
     * @param off 起始位置
     * @return 转换结果
     */
    public static short byte2ToUnsignedShort(byte[] bytes, int off) {
        int low = bytes[off] & 0xFF;
        int high = bytes[off + 1] & 0xFF;
        return (short) (((high & 0x00FF) << 8) | (0x00FF & low));
    }

    /**
     * 将四个字节转换为 float。
     *
     * @param bytes 字节数组
     * @param index 起始位置
     * @return 转换结果
     */
    public static float byte4float(byte[] bytes, int index) {
        int value = bytes[index] & 0xFF;
        value |= ((long) bytes[index + 1] << 8);
        value &= 0xFFFF;
        value |= ((long) bytes[index + 2] << 16);
        value &= 0xFFFFFF;
        value |= ((long) bytes[index + 3] << 24);
        return Float.intBitsToFloat(value);
    }

    /**
     * 将四个字节转换为 int32。
     *
     * @param bytes 字节数组
     * @param off 起始位置
     * @return 转换结果
     */
    public static int byte4ToInt(byte[] bytes, int off) {
        int b0 = bytes[off] & 0xFF;
        int b1 = bytes[off + 1] & 0xFF;
        int b2 = bytes[off + 2] & 0xFF;
        int b3 = bytes[off + 3] & 0xFF;
        return (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
    }

    /**
     * 将两个字节转换为 int16。
     *
     * @param bytes 字节数组
     * @param off 起始位置
     * @return 转换结果
     */
    public static int byte2ToInt(byte[] bytes, int off) {
        int b0 = bytes[off] & 0xFF;
        int b1 = bytes[off + 1] & 0xFF;
        return (b1 << 8) | b0;
    }

    /**
     * 将四个字节转换为 long。
     *
     * @param bytes 字节数组
     * @param off 起始位置
     * @return 转换结果
     */
    public static long byte4ToLong(byte[] bytes, int off) {
        long b0 = bytes[off] & 0xFF;
        long b1 = bytes[off + 1] & 0xFF;
        long b2 = bytes[off + 2] & 0xFF;
        long b3 = bytes[off + 3] & 0xFF;
        return (b3 << 24) | (b2 << 16) | (b1 << 8) | b0;
    }
}
