package com.zksy.environment.utils;

import cn.hutool.core.util.StrUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.util.internal.StringUtil;

/**
 * @Description
 * @Date 2021- 06-04-上午 9:02
 * @auther Javen
 */
public class DataCheckUtil {
    /**
     * 进行CRC16数据传输协议校验
     * @param puchMsg
     * @param usDataLen
     * @return
     */
    public static String crc16_Checkout(String puchMsg, int usDataLen){
        int i,j,crc_reg,check;

        crc_reg=0xFFFF;
        char[] chars = puchMsg.toCharArray();
        for(i=0;i<usDataLen;i++){
            crc_reg=(crc_reg>>8)^chars[i];
            for(j=0;j<8;j++) {
                check = crc_reg&0x0001;
                crc_reg>>=1;
                if(check==0x0001) {
                    crc_reg^=0xA001;
                }
            }
        }

        String code = as10to16(crc_reg);
        return code;
    }

    /**
     * 将10进制转16进制
     * @param number
     * @return
     */
    public static String as10to16(int number) {
        int i = 0;
        StringBuffer dataCode = new StringBuffer();
        char[] crc16Char = new char[100];
        if(number == 0){
            System.out.print(0);
        } else {
            while(number!=0) {
                int t=number%16;
                if(t >=0 && t<10) {
                    crc16Char[i] = (char)(t+'0');
                    i++;
                } else {
                    crc16Char[i] = (char)(t+'A'-10);
                    i++;
                }
                number=number/16;
            }

            for (int j=i-1;j>=0;j--) {
                dataCode.append(crc16Char[j]);
            }
        }
        //长度补齐4位
        String paddedString = StrUtil.fillBefore(String.valueOf(dataCode), '0', 4);
        return paddedString;
    }

    /**
     * TODO CRC16/MODBUS校验
     * @param str 16进制数据
     * @return java.lang.String
     * @author Administrator
     * @date 2023/12/19 13:18:37
     */
    public static String getCRC16Result(String str) {
        String paddedString = "";
        try {
            String strReplace = str.replace(" ", "");
            int CRC = 0x0000FFFF;
            for (int i = 0; i < strReplace.length(); i += 2) { // 改为 i += 2
                if (i + 2 > strReplace.length()) { // 添加条件检查
                    break; // 如果超出范围，则跳出循环
                }
                int CRCL = CRC & 0x000000FF; // 低八位
                int CRCH = CRC & 0x0000FF00; // 高八位
                String CRCIn = strReplace.substring(i, i + 2);
                int a = Integer.parseInt(CRCIn, 16); // 待处理数据转16进制
                CRC = CRCH + CRCL ^ a;
                for (int j = 0; j < 8; j++) {
                    if ((CRC & 0x0001) == 0) {
                        CRC = CRC >> 1;
                    } else {
                        CRC >>= 1;
                        CRC = CRC ^ 0xA001;
                    }
                }
            }
            String dataCode = Integer.toHexString(CRC);
            // 小写转大写
            String upperCaseStr = dataCode.toUpperCase();
            // 长度补齐4位
            paddedString = StrUtil.fillBefore(upperCaseStr, '0', 4);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return paddedString;
    }
    /**
     * TODO 16进制转10进制
     * @param hex
     * @return String
     * @author Administrator
     * @date 2023/11/13 15:31:52
     */
    public static String hexToDecimalExample(String hex){
        String str = "";
        int decimal=Integer.parseInt(hex,16);
        if(String.valueOf(decimal).length() < 2){
            str = "0"+decimal;
        }else{
            str = String.valueOf(decimal);
        }
        int num = Integer.parseInt(str);
        if(num > 127){
            str = String.valueOf(hexToDecimal(num));
        }
        return str;
    }

    /**
     * TODO 十进制大于127为负值
     * @param hexString
     * @return int
     * @author Administrator
     * @date 2024/8/6 10:10:04
     */
    public static int hexToDecimal(int hexString) {
        int decimal = 256 - hexString;
        return -decimal;
    }
    public static ByteBuf hexStringToByteBuf(String hexString) {
        byte[] bytes = StringUtil.decodeHexDump(hexString);
        return Unpooled.wrappedBuffer(bytes);
    }

}
