DELL
2024-09-24 a01db2b59f0de8dfa4fb029d86d45924f4534abc
兼容单体数据300 以及500的数据文件解析
3个文件已修改
95 ■■■■ 已修改文件
src/main/java/com/whyc/res/RESData.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/res/RESDataHead.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/RESDataInfoService.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/res/RESData.java
@@ -1,9 +1,11 @@
package com.whyc.res;
import com.whyc.util.ComBase;
import com.whyc.util.ComFn;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
@@ -13,10 +15,13 @@
    
    public static final int BYTE_LEN = 1812;
    public static final int DATABYTE_LEN = 1808;
    public static final int DATA_CHECK_BYTE_LEN = 6;
    private int[] dataType = new int[4];                         //固定值0xAA 0xAA 0xAA 0xAA
    private Date data_Time;                                       //记录时间/*Returns the datetime as the number of seconds that have passed since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC)*/
    private long dateTime;                                        //时间毫秒数
    private int battSum;                                        //固定值300
    private float[] MonomerVol = new float[MONOMER_NUM_MAX];    //单体电压,分辨率0.001V
@@ -25,27 +30,33 @@
    private int CRC16;
    
    public boolean setData(byte[] databuf) {
        ByteBuffer bf = ByteBuffer.allocate(BYTE_LEN);
        int Data_Len = 3 * battSum * 2 + 12;
        ByteBuffer bf = ByteBuffer.allocate(Data_Len);
        bf.order(ByteOrder.LITTLE_ENDIAN);
        for(int i=0;i<dataType.length;i++) {
            bf.put((byte)0xAA);
        }
        //System.out.println(databuf.length);
        bf.putInt((int)dateTime);
        bf.putShort((short) battSum);
        bf.put(databuf);
        bf.flip();
        bf.position(0);
        if(databuf.length < DATABYTE_LEN) {
        if(databuf.length < (3 * battSum * 2 + 2)) {
            //System.out.println("长度错误");
            return false;
        }
        //System.err.println(ComFn.bytesToHexString(databuf, databuf.length));
        int crc0 = bf.getShort(BYTE_LEN-2) & 0xFFFF;
        bf.position(BYTE_LEN-2);
        bf.putShort(ComBase.changeIntToShort(0));
        int crc1 = RES_Crc16.CalCRC16(bf, bf.limit());
        if(crc0 != crc1) {
            //System.out.println(crc0+"==="+crc1);
            return false;
        }
//        System.err.println(ComFn.bytesToHexString(bf.array(), bf.array().length));
//        int crc0 = bf.getShort(Data_Len-2) & 0xFFFF;
//        bf.position(Data_Len-2);
//        bf.putShort(ComBase.changeIntToShort(0));
//        int crc1 = RES_Crc16.CalCRC16(bf, bf.limit());
//        if(crc0 != crc1) {
//            System.err.println(crc0+"==="+crc1);
//            return false;
//        }
        
        bf.position(0);
        for(int i=0;i<dataType.length;i++) {
@@ -76,6 +87,37 @@
        }    
        return true;
    }
    public boolean readResMonCount(byte[] databuf) {
        ByteBuffer bf = ByteBuffer.allocate(10);            //读取时间以及单体数量,只能先读取单体数量才能确定后面读取结构体长度
        bf.order(ByteOrder.LITTLE_ENDIAN);
        for(int i=0;i<dataType.length;i++) {
            bf.put((byte)0xAA);
        }
        //System.out.println(databuf.length);
        bf.put(databuf);
        bf.position(0);
        if(databuf.length < 6) {
            //System.out.println("长度错误");
            return false;
        }
        bf.position(0);
        for(int i=0;i<dataType.length;i++) {
            dataType[i] = ComBase.changeByteToInt(bf.get());                         //固定值0xAA 0xAA 0xAA 0xAA
        }
        dateTime = bf.getInt();
        //System.out.println(dateTime);
        //System.out.println(new Date().getTime());
        data_Time = new Date(dateTime*1000);                                               //记录时间/*Returns the datetime as the number of seconds that have passed since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC)*/
        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        //System.out.println("记录时间" + sdf.format(data_Time));
        battSum = ComBase.changeShortToInt(bf.getShort());                            //固定值300 电操-500
        //System.out.println("battSum:"+battSum);
        return true;
    }
    
    public static int getMonomerNumMax() {
        return MONOMER_NUM_MAX;
src/main/java/com/whyc/res/RESDataHead.java
@@ -31,7 +31,7 @@
            SYNCode[i] = ComBase.changeByteToInt(bf.get());
        }
        record_times = ComBase.changeShortToInt(bf.getShort());
        System.out.println("次数:"+record_times);
        //System.out.println("次数:"+record_times);
        return true;
    }
    
src/main/java/com/whyc/service/RESDataInfoService.java
@@ -41,14 +41,24 @@
                {
                    if(resDataInfo.resDataHead.checkDataHead(fis))
                    {
                        byte[] databuf = new byte[RESData.DATABYTE_LEN];
                        if(fis.read(databuf) == databuf.length)
                        {
                            RESData resData = new RESData();
                            if(resData.setData(databuf)) {
                                resDataInfo.resDatas.add(resData);
                        RESData resData = new RESData();
                        byte[] checkbuf = new byte[RESData.DATA_CHECK_BYTE_LEN];
                        if(fis.read(checkbuf) == checkbuf.length){
                            if(resData.readResMonCount(checkbuf)){
                                int Data_LEN = 3 * resData.getBattSum() * 2 + 2;
                                //System.err.println("Data_LEN"+Data_LEN);
                                byte[] databuf = new byte[Data_LEN];
                                if(fis.read(databuf) == databuf.length)
                                {
                                    //RESData resData = new RESData();
                                    if(resData.setData(databuf)) {
                                        resDataInfo.resDatas.add(resData);
                                    }
                                }
                            }
                        }
                    }
                    if(fis.available() <1) {
                        break;
@@ -76,7 +86,10 @@
    }
    public static void main(String[] args) {
        String fileUrl="E:\\fileTest\\fbxtest\\resdata.bres";
        //String fileUrl="E:\\fileTest\\fbxtest\\resdata.bres";
        //String fileUrl="D:\\test\\resdata.bres";
        //String fileUrl="D:\\test\\resdata(1).bres";
        String fileUrl="D:\\test\\resdata(2).bres";
        RESDataInfo info = readFileData(fileUrl);
        System.out.println(info);
    }