package extract import ( "bufio" "fmt" "os" "path/filepath" "sort" log "github.com/sirupsen/logrus" "github.com/duke-git/lancet/v2/slice" ) const TransImageFrameLength = 8192 const TransImageFrameHeadLength = 16 const TransImageFrameDataLength = 8176 const ImageFrameHead = 0xE77EE77E // 智能载荷电箱与数传单机之间图像数据传输帧格式 type TransFrame struct { Header [4]byte // 帧头 E77EE77E SNo uint32 // 序列号 大端序 Reserved0 [2]byte // 保留字节 KeyIndex uint16 // 密钥库索引号 大端序 SecretFlag byte // 明密标志 0x55 明传 0xAA 密传 FrameFlag byte // 帧类型 0x00:智能载荷电箱有效帧 0x55: 智能载荷电箱空帧 FileNo uint8 // 文件编号 Reserved1 byte // 保留字节 0x00 Data []byte // 数据区 8176字节 } func (t *TransFrame) Decode(frame []byte) { if len(frame) < TransImageFrameLength { return } copy(t.Header[:], frame[:4]) t.SNo = uint32(frame[4])<<24 | uint32(frame[5])<<16 | uint32(frame[6])<<8 | uint32(frame[7]) copy(t.Reserved0[:], frame[8:10]) t.KeyIndex = uint16(frame[10])<<8 | uint16(frame[11]) t.SecretFlag = frame[12] t.FrameFlag = frame[13] t.FileNo = frame[14] t.Reserved1 = frame[15] t.Data = append(t.Data, frame[16:8192]...) } // 提取图像传输帧中的原始图像数据 func (p *Extractor) ExtractOriginalImageData(aosDataFile string) ([]string, error) { var sData []string nullFrmCnt := 0 aosData, err := os.ReadFile(aosDataFile) if err != nil { log.Println("read data from", aosDataFile, "error:", err.Error()) return nil, err } snRange := map[int][]uint32{} datSet := map[int][]byte{} var i int for i < len(aosData) { if i+4 > len(aosData) { log.Println("end of trans frame data") break } if aosData[i] == 0xE7 && aosData[i+1] == 0x7E && aosData[i+2] == 0xE7 && aosData[i+3] == 0x7E { if i+TransImageFrameLength > len(aosData) { log.Println("there are not enough data for a trans frame", len(aosData)-i) break } var tf TransFrame tf.Decode(aosData[i : i+TransImageFrameLength]) fileno := int(tf.FileNo) snRange[fileno] = append(snRange[fileno], tf.SNo) if tf.SecretFlag == 0xAA { log.Info("secret frame is not supported") // break } // 只保留非空帧 if tf.FrameFlag != 0x55 && fileno != 0 { datSet[fileno] = append(datSet[fileno], tf.Data...) } else { nullFrmCnt++ } i += TransImageFrameLength continue } i++ } log.Println("null transfer frame cnt:", nullFrmCnt) if len(snRange) == 0 { log.Errorf("no valid transfer frame found in %s", aosDataFile) } for k, v := range snRange { vv := slice.Unique(v) sort.Slice(vv, func(i, j int) bool { return vv[i] < vv[j] }) fmt.Println("fileno:", k, ", sn range:", vv[0], "-", vv[len(vv)-1], "len", len(vv)) } for k, v := range datSet { frameCnt := slice.Unique(snRange[k]) if len(frameCnt) < 4096 { log.Println("fileno", k, "数据长度不足4096帧") continue } s01 := filepath.Join(p.params.TempPath, fmt.Sprintf("%s_%s_S%d.dat", p.params.Satellite, p.params.DataId, k)) fo, err := os.OpenFile(s01, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777) if err != nil { log.Println("create file", s01, "error:", err.Error()) return nil, err } w := bufio.NewWriter(fo) w.Write(v) w.Flush() fo.Close() sData = append(sData, s01) } return sData, nil }