package com.zksy.pressure.utils;

import java.time.LocalDateTime;

/**
 * @Description
 * @Date 2025- 03-06-上午 9:02
 * @auther tuDouSi
 */
public class DataCheckUtil {
    /**
     *
     * @description: crc16校验,输入一个数据,返回一个数组.
     * @param str
     * @return 返回两个校验码,低字节在前,高字节在后
     *
     */
    public static String crc16(String str) {
        int[] data = hexStringToIntArray(str);
        int xda, xdapoly;
        int i, j, xdabit;
        xda = 0xFFFF;
        xdapoly = 0xA001;
        for (i = 0; i < data.length; i++) {
            xda ^= data[i];
            for (j = 0; j < 8; j++) {
                xdabit = (int) (xda & 0x01);
                xda >>= 1;
                if (xdabit == 1) {
                    xda ^= xdapoly;
                }
            }
        }
        byte[] temdata = new byte[2];
        temdata[0] = (byte) (xda & 0xFF);
        temdata[1] = (byte) (xda >> 8);
        return bytesToHexString(temdata);
    }
    /**
     *
     * @description: crc16校验,
     * @param str
     * @return 返回两个校验码,高字节在前,低字节在后
     *
     */
    public static String crc16Tall(String str) {
        int[] data = hexStringToIntArray(str);
        int xda, xdapoly;
        int i, j, xdabit;
        xda = 0xFFFF;
        xdapoly = 0xA001;
        for (i = 0; i < data.length; i++) {
            xda ^= data[i];
            for (j = 0; j < 8; j++) {
                xdabit = (int) (xda & 0x01);
                xda >>= 1;
                if (xdabit == 1) {
                    xda ^= xdapoly;
                }
            }
        }

        // 关键修改：先放高位字节，再放低位字节
        byte[] temdata = new byte[2];
        temdata[0] = (byte) (xda >> 8);  // 高位字节
        temdata[1] = (byte) (xda & 0xFF); // 低位字节

        return bytesToHexString(temdata);
    }
    // 将十六进制字符串转换为整数数组
    private static int[] hexStringToIntArray(String str) {
        if (str.length() % 2 != 0) {
            throw new IllegalArgumentException("Hex string length must be even");
        }

        int[] result = new int[str.length() / 2];
        for (int i = 0; i < str.length(); i += 2) {
            result[i / 2] = Integer.parseInt(str.substring(i, i + 2), 16);
        }
        return result;
    }

    // 将字节数组转换为十六进制字符串
    private static String bytesToHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }
    /**
     * 获取当前时间的十六进制字符串（符合报文协议格式：年月日时分秒，每个部分两位十六进制）
     * 示例：2025年09月11日16点35分07秒 → 17 01 06 11 35 07 → 拼接为 170106113507
     * 转换规则：
     * - 年：4位十进制 → 拆分为前两位+后两位，分别转十六进制（如2025 → 20=0x14，25=0x19 → 1419；2026→20=0x14,26=0x1A→141A）
     * - 月/日/时/分/秒：2位十进制 → 直接转两位十六进制（不足两位补0）
     * @return 12位的十六进制时间字符串（无空格）
     */
    static String getCurrentTimeHex() {
        // 1. 获取当前本地时间
        LocalDateTime now = LocalDateTime.now();

        // 2. 拆分时间各部分（关键：年份只取后两位）
        int yearLastTwo = now.getYear() % 100;  // 年的后两位
        int month = now.getMonthValue();        // 月（1-12）
        int day = now.getDayOfMonth();          // 日（1-31）
        int hour = now.getHour();              // 时（0-23）
        int minute = now.getMinute();          // 分（0-59）
        int second = now.getSecond();          // 秒（0-59）
        // %02d 表示：十进制、两位、不足补0
        return String.format("%02d%02d%02d%02d%02d%02d",
                yearLastTwo, month, day, hour, minute, second);
    }

}
