解析十六进制雷达数据格式:解析雷达FSPEC数据

以Cat62格式雷达数据为例,十六进制雷达数据部分代码:

3e0120bf7da4ffee0085

base_fspec_processor.h

//
// Created by qiaowei on 2024-02-03.
//#ifndef RADARDATACONTROLLER_BASE_FSPEC_PROCESSOR_H
#define RADARDATACONTROLLER_BASE_FSPEC_PROCESSOR_H#include <QVector>
#include <QString>namespace processor {class BaseFspecProcessor {public:virtual QVector<int>* processor(const QString& content,int begin_position_index,int& end_position_index) = 0;};} // processor#endif //RADARDATACONTROLLER_BASE_FSPEC_PROCESSOR_H

cat62_fspec_processor.h

//
// Created by qiaowei on 2024-01-25.
//#ifndef RADARDATACONTROLLER_CAT62_FSPEC_PROCESSOR_H
#define RADARDATACONTROLLER_CAT62_FSPEC_PROCESSOR_H#include <QObject>
#include <QVector>
#include <QList>#include "../baseprocess/base_fspec_processor.h"namespace processor {/*** @copyright 2003-2024* @date      2024-02-09 22:40* @author    qiao wei* @version   1.0* @brief     处理十六进制雷达数据的FSPEC数据。* @history*/class Cat62FspecProcessor : public QObject, public BaseFspecProcessor {Q_OBJECTpublic:explicit Cat62FspecProcessor(QObject* parent = nullptr);virtual ~Cat62FspecProcessor() override;/*** @author  qiao wei* @brief   从雷达数据hex_track_data中读取FSPEC数据。将FSPEC数据按照二进制格式保存到QVector<int>指针并返回。* @param   hex_track_data 十六进制雷达数据。* @param   begin_position FSPEC数据的起始索引。* @param   readed_data_end_position FSPEC数据的末位索引。* @return  QVector<int>指针。二进制格式保存的FSPEC数据。* @history*/virtual QVector<int>* processor(const QString& hex_track_data,int begin_position,int& readed_data_end_position) override;private:/*** @author  qiao wei* @brief   将存储FSPEC内容由十六进制的字符串转换为二进制的QVector<int>*。* @param   fspec_content FSPEC内容字符串。* @param   count FSPEC内容的字节数。因为参数content是2个字符组成1个字节,所以count数为字符串中字符数量的一半。* @return  FSPEC内容转换为二进制的QVector<int>*。* @history*/QVector<int>* convertFspecToIntArray(QString fspec_content);/*** @author  qiao wei* @brief   将int数据value以二进制数的格式保存到容器vector的指定位置处。*          传入的value是1个字节,将其转换为8位二进制数从左向右保存,因为每次只能保存1个字节的数据,保存多个*          字节的数据需要依次保存到容器vector中。* @param   vector 存储二进制数的容器。* @param   value FSPES数据中的1个字节。* @param   begin_position 将字节value转换成二进制数保存到容器vector的第一位索引。* @return* @history*/virtual void replaceBinaryValueToContainer(QVector<int>* vector, int value, int begin_position);/*** @author  qiao wei* @brief   分步骤读取十六进制雷达数据track_data中的FSPEC数据,返回起始索引begin_position的1个字节FSPEC数据。* @param   track_data 十六进制雷达数据。* @param   begin_position 读取FSPEC数据的首位索引。* @param   readed_data_end_position 读取FSPEC数据的末位索引,该参数为引用类型。* @return  返回读取的1个字节FSPEC数据,如果数据读取异常则返回""。* @history*/QString readAByteFspec(const QString& track_data,int begin_position,int& readed_data_end_position);/*** @author  qiao wei* @brief   将完整的FSPEC数据从雷达数据中读取出。* @param   track_data 十六进制雷达数据。* @param   begin_position_index FSPEC在track_data中的起始索引。* @return  FSPEC数据。* @history*/QString readFspecContent(const QString& track_data,int begin_position_index);/*** @author  qiao wei* @brief   判断1个字节的数据是否是FSPEC数据的最后1个字节。* @param   a_byte_fspec_content 1个字节的FSPEC数据。* @return  true 已到FSPEC数据末位。* @history*/bool isTheLastValueOfFspec(QString a_byte_fspec_content);private:/*** @author qiao wei* @brief  标识位,通过与运算判断字节最后一位是否为0。0b0000,0001。*/const static int THE_0_POSITION_VALUE;/*** @author qiao wei* @brief  0b1000,0000。*/const static int THE_7_POSITION_VALUE;};} // processor#endif //RADARDATACONTROLLER_CAT62_FSPEC_PROCESSOR_H

base_fspec_processor.cpp

//
// Created by qiaowei on 2024-01-25.
//#include <QtDebug>#include "cat62_fspec_processor.h"namespace processor {const int Cat62FspecProcessor::THE_0_POSITION_VALUE{1};const int Cat62FspecProcessor::THE_7_POSITION_VALUE{128};Cat62FspecProcessor::Cat62FspecProcessor(QObject* parent) : QObject(parent) {}Cat62FspecProcessor::~Cat62FspecProcessor() {}QVector<int>* Cat62FspecProcessor::processor(const QString& hex_track_data,int begin_position,int& readed_data_end_position) {/*** 1:从hex_track_data数据中读取完整的FSPEC数据。* 1.1:从begin_position索引开始,依次读取2个字符(1个字节)。* 1.2:判断读取的2个字符是否是FSPEC数据结尾。* 1.3:将读取的2个字符依次添加到同一个字符串中,如果到了FSPEC数据结尾,则不再读取数据。* 2:将FSPEC数据转换成int类型,保存到QVector<int>*容器。* 3:返回QVect<int>*容器。*/readed_data_end_position = begin_position;// 保存hex_track_data数据中指定位置的FSPEC数据。QString fspec_content = readFspecContent(hex_track_data, begin_position);readed_data_end_position = readed_data_end_position + fspec_content.length() - 1;QVector<int>* fspec_vector = convertFspecToIntArray(fspec_content);return fspec_vector;}QVector<int>* Cat62FspecProcessor::convertFspecToIntArray(QString fspec_content) {/*** 雷达数据中,2个字符表示1个字节。* 根据字节数设置对应的QVector<int>*容量。1个字节是8位二进制数。*/// 获取FSPEC数据中字节个数。int byte_count{fspec_content.length() / 2};QVector<int>* vector{new QVector<int>(byte_count * 8)};const int step{2};int begin_position_index{0};int value{0};for (int index{0}; index != byte_count; ++index) {value = fspec_content.mid(begin_position_index, step).toInt(nullptr, 16);replaceBinaryValueToContainer(vector, value, index * 8);begin_position_index += step;}return vector;}void Cat62FspecProcessor::replaceBinaryValueToContainer(QVector<int>* vector,int value,int begin_position) {// 遍历1个字节所有位的次数。const int count{8};/*** 1:依次遍历value值的每一位(8位二进制,从左侧高位开始依次遍历),并将二级制值保存到容器vector。* 2:右移1位。依次读取value中每一位二进制值。*/for (int index{0}; index != 8; ++index) {vector->replace(begin_position + index,((THE_7_POSITION_VALUE == (value & THE_7_POSITION_VALUE)) ? 1 : 0));value = value<<1;}}QString Cat62FspecProcessor::readAByteFspec(const QString& track_data,int begin_position,int& readed_data_end_position) {readed_data_end_position = begin_position;QString content{track_data.mid(begin_position, 2)};// 当前数据的末位索引。“+2”是当前数据末位下一位的索引,所以要减1。保证数据与参数名一致。readed_data_end_position = begin_position + 2 - 1;/*** 判断读取的1个字节(2个字符)的FSPEC数据是否为空,是否读取到的是1个字节。如果以上条件满足,返回* 字符串content,反之返回""。*/if (!content.isNull() && 2 == content.length()) {return content;} else {return "";}}QString Cat62FspecProcessor::readFspecContent(const QString& track_data,int begin_position_index) {int end_position_index{begin_position_index};QString fspec_content;QString a_byte_fspec_content;/*** 从雷达数据track_data中依次读取1个字节FSPEC数据,将数据保存到字符串fspec_content。* 判断是否是FSPEC最后一个字节,如果不是继续读取FSPEC数据,反之退出循环。*/while (true) {a_byte_fspec_content =readAByteFspec(track_data,begin_position_index,end_position_index);begin_position_index = end_position_index + 1;fspec_content.append(a_byte_fspec_content);if (isTheLastValueOfFspec(a_byte_fspec_content)) {break;}}return fspec_content;}bool Cat62FspecProcessor::isTheLastValueOfFspec(QString a_byte_fspec_content) {int value{a_byte_fspec_content.toInt(nullptr, 16)};return ((THE_0_POSITION_VALUE & value) == THE_0_POSITION_VALUE) ? false : true;}} // processor

main.cpp

#include <string>#include <QApplication>
#include <QVector>
#include <QtDebug>
#include <QString>#include "./form/main_window.h"
#include "./cat62process/cat62_fspec_processor.h"
#include "./cat62process/cat_62_length_processor.h"
#include "./cat62process/cat_62_header_processor.h"using std::string;using form::MainWindow;
using processor::Cat62FspecProcessor;
using processor::Cat62HeaderProcessor;
using processor::Cat62LengthProcessor;int main(int argc,char *argv[]) {QApplication a(argc, argv);//    MainWindow* main_window{new MainWindow{nullptr}};
//    main_window->show();QString content = "3e0120bf7da4ffee00859880007205a0";int begin_position{0};int end_position = begin_position;Cat62HeaderProcessor* header_processor{new Cat62HeaderProcessor{}};qDebug()<< header_processor->processor(content, begin_position, end_position);qDebug()<< "Header end position: " << end_position;begin_position = end_position + 1;Cat62LengthProcessor* lenght_processor{new Cat62LengthProcessor{}};qDebug()<< lenght_processor->processor(content, begin_position, end_position);qDebug()<< "Length end position: " << end_position;begin_position = end_position + 1;Cat62FspecProcessor* fspec_processor{new Cat62FspecProcessor{}};QVector<int>* vector = fspec_processor->processor(content, begin_position, end_position);for (int index = 0; index < vector->capacity(); ++index) {qDebug()<< index << ": " << vector->at(index) << ", ";}qDebug()<< "FSPEC end position: " << end_position;return QApplication::exec();
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/463086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习的进展及其在各领域的应用

深度学习&#xff0c;作为人工智能的核心分支&#xff0c;近年来在全球范围内引起了广泛的关注和研究。它通过模拟人脑的学习机制&#xff0c;构建复杂的神经网络结构&#xff0c;从大量数据中学习并提取有用的特征表示&#xff0c;进而解决各种复杂的模式识别问题。 一、深度…

MFC实现遍历系统进程

今天我们来枚举系统中的进程和结束系统中进程。 认识几个API 1&#xff09;CreateToolhelp32Snapshot 用于创建系统快照 HANDLE WINAPI CreateToolhelp32Snapshot( __in DWORD dwFlags, //指定快照中包含的系统内容__in DWORD th32P…

前端JavaScript篇之call() 和 apply() 的区别?

目录 call() 和 apply() 的区别&#xff1f; call() 和 apply() 的区别&#xff1f; 在JavaScript中&#xff0c;call()和apply()都是用来改变函数中this指向的方法&#xff0c;它们的作用是一样的&#xff0c;只是传参的方式不同。 call()方法和apply()方法的第一个参数都是…

fyne x86 32位

条件&#xff1a; gcc 32位 任意go环境&#xff08;x86 x64均可&#xff09; fyne 编译&#xff1a; set goarch386 fyne package

算法---回溯(正文)

1.什么是回溯&#xff1f; 回溯算法的定义就是和暴力枚举一样枚举所有可能并加撤回&#xff0c;也能和暴力一样去掉一些重复&#xff08;在之前就被筛出&#xff0c;但还要枚举这个&#xff0c;我们可以跳过这个了---------这个就是回溯剪枝&#xff09;。但为什么回溯不是暴力…

【linux系统体验】-archlinux折腾日记

archlinux 一、系统安装二、系统配置及美化2.1 中文输入法2.2 安装virtualbox增强工具2.3 终端美化 三、问题总结3.1 一、系统安装 安装步骤人们已经总结了很多很全: Arch Linux图文安装教程 大体步骤&#xff1a; 磁盘分区安装 Linux内核配置系统&#xff08;基本软件&…

C#使用哈希表对XML文件进行查询

目录 一、使用的方法 1.Hashtable哈希表 2.Hashtable哈希表的Add方法 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;示例 3.XML文件的使用 二、实例 1.源码 2.生成效果 可以通过使用哈希表可以对XML文件进行查询。 一、使用的方法 1.Hashtable哈希表…

2024-02-08(Flume)

1.Flume 的架构和MQ消息队列有点类似 2.Flume也可以做数据的持久化操作 在Channel部分选择使用File channel组件 3.Flume进行日志文件监控 场景&#xff1a;企业中应用程序部署后会将日志写入到文件中&#xff0c;我们可以使用Flume从各个日志文件将日志收集到日志中心以便…

深入理解java之多线程(一)

前言&#xff1a; 本章节我们将开始学习多线程&#xff0c;多线程是一个很重要的知识点&#xff0c;他在我们实际开发中应用广泛并且基础&#xff0c;可以说掌握多线程编写程序是每一个程序员都应当必备的技能&#xff0c;很多小伙伴也会吐槽多线程比较难&#xff0c;但因为其实…

【Web】基于Mybatis的SQL注入漏洞利用点学习笔记

目录 MyBatis传参占位符区别 不能直接用#{}的情况 in多参数值查询 like %%模糊查询 order by列名参数化 MyBatis传参占位符区别 在 MyBatis 中&#xff0c;#{} 和 ${} 都是用于传参的占位符&#xff0c;但它们之间有很大的区别&#xff0c;主要体现在两个方面&#xff1a…

鸿蒙开发(六)布局概述

迄今为止&#xff0c;我还没有正式提到布局的概念。但其实我之前的demo里面&#xff0c;已经默认使用到了一种布局&#xff0c;那就是线性布局&#xff08;Row、Column&#xff09;&#xff0c;这也是DevEco创建项目默认页面里面默认采用的布局。那么本篇&#xff0c;带着大家一…

[SAP] ABAP设置非系统关键字代码提示功能

在事务码SE38(ABAP编辑器)屏幕右下角&#xff0c;点击【Options选项】图标 勾选【代码完成】|【建议文本中的非关键字】&#xff0c;并点击【保存】按钮 在下面的程序代码中&#xff0c;当我需要输入在11行的位置输入非关键字lv_str的时候&#xff0c;会有非关键字代码提示的功…