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

news2024/11/19 21:16:49

以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_OBJECT

    public:
        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.coloradmin.cn/o/1442718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音视频/流媒体协议和编码汇总

一、流媒体协议 1. RTMP/RTMPT/RTMPS/RTMPE 等多变种 是应用层协议&#xff0c;使用TCP作为底层传输协议&#xff0c;并提供了低延迟、高带宽利用率和实时性的特点。 (1)RTMP协议是Adobe的私有协议,未完全公开 (2)一般传输的是 flv&#xff0c;f4v 格式流 2. RTP/RTCP/SRTP …

【51单片机】LCD1602(可视化液晶屏)调试工具的使用

前言 大家好吖&#xff0c;欢迎来到 YY 滴 单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…

网络编程..

1.互联网 有了互联网的出现 我们就可以足不出户的实现看电影、购物等等操作 我们认知中可能的互联网模型 较为真实的互联网模型 那么数据是如何从一个设备传递到另外一个设备的呢&#xff1f; 2.网络互联模型 统共有三种&#xff1a; 3.TCP/IP协议 TCP/IP是一群协议 里面…

Debezium发布历史120

原文地址&#xff1a; https://debezium.io/blog/2022/04/07/read-only-incremental-snapshots/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Read-only Incremental Snapshots for MySQL April 7, 2022 by K…

Amazon Dynamo学习总结

目录 一、Amazon Dynamo的问世 二、Amazon Dynamo主要技术概要 三、数据划分算法 四、数据复制 五、版本控制 六、故障处理 七、成员和故障检测 一、Amazon Dynamo的问世 Amazon Dynamo是由亚马逊在2007年开发的一种高度可扩展和分布式的键值存储系统&#xff0c;旨在解…

过渡效果的艺术:CSS transition 让网页交互更平滑(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

扑克牌大小(模拟)

题目 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String s sc.nextLine();String[] ss s.split("-");StringBuffer s1 new StringBuffer();StringBuffer s2 new StringBuffer(…

“智能检测,精准把控。温湿度检测系统,为您的生活带来全方位的健康保障。”#非标协议项目【下】(分文件编程)

“智能检测&#xff0c;精准把控。温湿度检测系统&#xff0c;为您的生活带来全方位的健康保障。”#非标协议项目【下】&#xff08;分文件编程&#xff09; 前言预备知识1温湿度检测系统需求2.分文件编程核心思路3.分文件编程操作4利用分文件操作建立uart.c、lcd1602.c、dht11…

RM电控--机械入门

SW常用的快捷键&#xff1a; 多种视角观看&#xff1a; 左侧为自攻螺丝&#xff0c;右侧为钻尾螺丝 钻尾螺丝可以依靠自身进行钻孔操作&#xff0c;而自攻螺丝打之前必须先打好小孔。 螺钉; 这些螺钉大家认得全吗&#xff1f;你还知道哪些呢&#xff1f;_哔哩哔哩_bilibili …

Web Services 服务 是不是过时了?创建 Web Services 服务实例

Web Services 是不是过时了&#xff1f; 今天是兔年最后一天&#xff0c;先给大家拜个早年 。 昨天上午视频面试一家公司需要开发Web Services 服务&#xff0c;这个也没有什么&#xff0c;但还需要用 VB.net 开发。这个是多古老的语言了&#xff0c;让我想起来了 10年 前 写 …

Zookeeper集群搭建(3台)

准备工作 1、提前安装好hadoop102、hadoop103、hadoop104三台机器&#xff0c;参照&#xff1a;CentOS7集群环境搭建&#xff08;3台&#xff09;-CSDN博客 2、提前下载好Zookeeper安装包并上传到/opt/software上、安装包&#xff0c;链接&#xff1a;https://pan.baidu.com/…

Linux 软件管理(YUM RPM)

1 YUM yum&#xff08;全称为 Yellow dog Updater, Modified&#xff09;是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理&#xff0c;能够从指定的服务器自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软件包&#xff0c;无须繁琐地一次次…

vscode wsl远程连接 权限问题

问题描述&#xff1a;执行命令时遇到Operation not permitted 和 Permission denied问题&#xff0c;是有关ip地址和创建文件的权限问题&#xff0c;参考网络上更改wsl.conf文件等方法均无法解决&#xff0c;只能加sudo来解决

推荐几个Python爬虫接单渠道

前言 平时工作有闲的家人们&#xff0c;今天给大家推荐一些用Python爬虫做私活的渠道&#xff01; 【Python爬虫学习资料】 先给各位还不熟悉Python爬虫的朋友介绍一下&#xff01; 可以短时间获得大量资料~ 可以进一步数据分析 当然也可以获得收益&#xff01; 学会Python…

从0开始图形学(光栅化)

前言 说起图形学&#xff0c;很多人就会提到OpenGL&#xff0c;但其实两者并不是同一个东西。引入了OpenGL加重了学习的难度和成本&#xff0c;使得一些原理并不直观。可能你知道向量&#xff0c;矩阵&#xff0c;纹理&#xff0c;重心坐标等概念&#xff0c;但就是不知道这些概…

社区店经营策划书:从零到一,打造特色店铺

作为一名资深的鲜奶吧创业者&#xff0c;我深知开一家社区店并非易事&#xff0c;但凭借五年的经营经验和不断的学习&#xff0c;我成功地将我的鲜奶吧打造成为了一个特色店铺。 今天&#xff0c;我将与大家分享这份经营策划书&#xff0c;希望能为那些想开鲜奶吧或开其他店铺…

图书系统的Web实现(含源码)

源码地址https://gitee.com/an-indestructible-blade/project 注意事项&#xff1a; BorrowBooksWeb\src\main\resources路径下的application.yml文件里面的url&#xff0c;username&#xff0c;password这三个属性和自己的数据库保持一致。 浏览器访问url:http://127.0.0.1:…

阿里云游戏服务器租用费用价格组成,费用详单

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

假期刷题打卡--Day27

1、MT1217矩阵乘法 输入3X4整型矩阵A和4X3的整型矩阵B&#xff0c;计算A*B&#xff0c;放到矩阵C里面&#xff0c;输出矩阵C。 格式 输入格式&#xff1a; 分两行输入两个矩阵&#xff0c;空格分隔。 输出格式&#xff1a; 按矩阵形式输出&#xff0c;整型&#xff0c;每…

鸿蒙DevEco开发模拟器无法启动问题

新电脑安装鸿蒙DevEco时&#xff0c;运行后能预览但不能运行启动模拟器&#xff0c;表现为直接卡死或第二次运行时卡死&#xff0c;如下。 官方解决方案如下三种方式进行解决&#xff1a; 在Local Emulator的设备列表窗口&#xff0c;点击“Wipe User Data”清除模拟器数据&am…