当前位置: 首页 > news >正文

环形缓冲区

什么是环形缓冲区

环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个"环"。

环形缓冲区的用途

  1. 串口通信
    在嵌入式设备中,串口是常用的通信接口。环形缓冲区可用于缓存收发数据,平衡通信速率差异。
  2. 音视频数据处理
    音视频数据往往是连续的数据流。使用环形缓冲区可以平滑数据的生成和消耗,避免数据丢失或延迟。
  3. 传感器数据采集
    传感器数据通常以固定频率采样。环形缓冲区可作为数据采集和处理之间的缓冲,降低实时性要求。
  4. 多线程数据传递
    在多线程编程中,环形缓冲区是一种简单高效的线程间通信方式,无需复杂的同步操作。
  5. 数据打包与解析
    一些通信协议使用特定的数据帧格式。环形缓冲区可用于数据的打包和解析,保证数据的完整性。

环形缓冲区的实现示例

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>// 环形缓冲区大小
#define BUFFER_SIZE 256// 定义解析器状态
typedef enum {STATE_WAIT_START,    // 等待消息开始STATE_READ_LENGTH,   // 读取消息长度STATE_READ_DATA      // 读取消息数据
} ParserState;typedef struct {uint8_t buffer[BUFFER_SIZE];volatile uint16_t head;volatile uint16_t tail;
} RingBuffer;void RingBuffer_Init(RingBuffer *rb) {rb->head = 0;rb->tail = 0;
}bool RingBuffer_Write(RingBuffer *rb, uint8_t data) {uint16_t next = (rb->head + 1) % BUFFER_SIZE;if (next == rb->tail) {// 缓冲区满return false;}rb->buffer[rb->head] = data;rb->head = next;return true;
}bool RingBuffer_Read(RingBuffer *rb, uint8_t *data) {if (rb->head == rb->tail) {// 判满return false;}*data = rb->buffer[rb->tail];rb->tail = (rb->tail + 1) % BUFFER_SIZE;return true;
}// 处理完整消息的函数
void process_message(const uint8_t *msg, uint8_t length) {for (uint8_t i = 0; i < length; i++) {printf("%c", msg[i]);}printf("\n");
}// 有限状态机解析器
void parse_messages(RingBuffer *rb) {static ParserState state = STATE_WAIT_START;static uint8_t msg_length = 0;static uint8_t msg_index = 0;static uint8_t message[128]; //uint8_t byte;while (RingBuffer_Read(rb, &byte)) {switch (state) {case STATE_WAIT_START:  // 等待消息起始if (byte == 0xAA) { // 0xAA是消息起始标志state = STATE_READ_LENGTH;}break;case STATE_READ_LENGTH:  // 读取消息长度msg_length = byte;if (msg_length > 0 && msg_length < sizeof(message)) {msg_index = 0;state = STATE_READ_DATA;} else {// 无效长度,重置状态state = STATE_WAIT_START;}break;case STATE_READ_DATA:  // 读取消息数据message[msg_index++] = byte;if (msg_index >= msg_length) {process_message(message, msg_length);state = STATE_WAIT_START;}break;default:state = STATE_WAIT_START;break;}}
}// 发送函数
void threadA_send(RingBuffer *rb, const uint8_t *msg, uint8_t length) {RingBuffer_Write(rb, 0xAA); // 起始标志RingBuffer_Write(rb, length); // 长度字段for (uint8_t i = 0; i < length; i++) {RingBuffer_Write(rb, msg[i]);}
}// 接收函数
void threadB_receive(RingBuffer *rb) {parse_messages(rb);
}void test_ring_buffer(void) {// 1. 初始化环形缓冲区RingBuffer rb;RingBuffer_Init(&rb);printf("=== 环形缓冲区测试开始 ===\n\n");// 2. 测试基本消息发送和接收printf("测试1: 基本消息收发\n");const uint8_t test_msg1[] = "Hello World";threadA_send(&rb, test_msg1, sizeof(test_msg1) - 1);threadB_receive(&rb);// 3. 测试空缓冲区printf("\n测试2: 空缓冲区读取\n");uint8_t temp;if (!RingBuffer_Read(&rb, &temp)) {printf("空缓冲区测试通过: 无法从空缓冲区读取数据\n");}// 4. 测试缓冲区满状态printf("\n测试3: 缓冲区满状态\n");uint8_t large_msg[BUFFER_SIZE];for (int i = 0; i < BUFFER_SIZE; i++) {large_msg[i] = 'A' + (i % 26);  // 填充A-Z循环}bool write_result = true;int write_count = 0;while (write_result && write_count < BUFFER_SIZE + 10) {write_result = RingBuffer_Write(&rb, large_msg[write_count % BUFFER_SIZE]);write_count++;}printf("写入计数: %d (应小于缓冲区大小)\n", write_count - 1);// 5. 测试长消息分段发送printf("\n测试4: 长消息分段发送\n");RingBuffer_Init(&rb);  // 重新初始化const uint8_t long_msg[] = "This is a long message to test multiple segments";const int SEGMENT_SIZE = 10;for (size_t i = 0; i < (size_t)(sizeof(long_msg) - 1); i += (size_t)SEGMENT_SIZE) {size_t current_length = ((sizeof(long_msg) - 1 - i) < (size_t)SEGMENT_SIZE) ? (sizeof(long_msg) - 1 - i) : (size_t)SEGMENT_SIZE;threadA_send(&rb, &long_msg[i], current_length);threadB_receive(&rb);}// 6. 测试无效消息printf("\n测试5: 无效消息处理\n");uint8_t invalid_msg[] = {0xAA, 0xFF, 0x01, 0x02};  // 无效长度for (size_t i = 0; i < sizeof(invalid_msg); i++) {RingBuffer_Write(&rb, invalid_msg[i]);}threadB_receive(&rb);// 7. 测试快速读写切换printf("\n测试6: 快速读写切换\n");const uint8_t test_msg2[] = "Test";for (int i = 0; i < 5; i++) {threadA_send(&rb, test_msg2, sizeof(test_msg2) - 1);threadB_receive(&rb);}printf("\n=== 环形缓冲区测试完成 ===\n");
}int main() {test_ring_buffer();return 0;
}

总结

与传统的数组或链表相比,环形缓冲区有以下优点:
1.无需频繁移动数据。环形缓冲区的读写指针移动不会导致数据搬移,效率更高。
2.自动处理缓冲区"满"和"空"的状态。通过读写指针的关系可以判断缓冲区状态,无需额外的计数器。
3. 适用于生产者-消费者模型。一个线程写入数据,另一个线程读取数据,天然支持异步处理。

相关文章:

环形缓冲区

什么是环形缓冲区 环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个"环"。…...

Maven 仓库

Maven 仓库对于管理构建 Java 项目所需的依赖和插件至关重要。 Maven 仓库主要有三种类型&#xff1a;本地仓库、中央仓库和远程仓库。 本文将探讨每种仓库的用途以及如何有效使用它们。 Maven 仓库类型 本地仓库 本地仓库是位于您本地机器上的一个目录&#xff0c;Maven 在…...

29.UE5蓝图的网络通讯,多人自定义事件,变量同步

3-9 蓝图的网络通讯、多人自定义事件、变量同步_哔哩哔哩_bilibili 目录 1.网络通讯 1.1玩家Pawn之间的同步 1.2事件同步 1.3UI同步 1.4组播 1.5变量同步 1.网络通讯 1.1玩家Pawn之间的同步 创建一个第三人称项目 将网络模式更改为监听服务器&#xff0c;即将房主作为…...

计算机网络习题解答--个人笔记(未完)

本篇文章为关于《计算机网络-自顶向下方法第七版》的阅读总结和课后习题解答(未完待续) 第二章&#xff1a; cookie&#xff1a;&#xff08;这里是比较老版本的HTTP&#xff0c;具体HTTPs是怎么实现的不是很清楚&#xff09;cookie的原理其实很简单。就是在HTTP消息头上又多…...

Unity图形学之雾Fog

1.设置雾化&#xff1a; 2.雾化变化曲线&#xff1a;FogMode &#xff08;1&#xff09;线性&#xff1a; &#xff08;2&#xff09;一次指数&#xff1a; &#xff08;3&#xff09;二次指数&#xff1a; Shader "Custom/FogTest" {Properties{_Color ("Color…...

ML 系列:第 36 节 — 统计学中的抽样类型

ML 系列&#xff1a;第 36 天 — 统计学中的抽样类型 文章目录 一、说明二、抽样方法三、简单随机抽样四、 Stratified Sampling分层抽样五、 Cluster Sampling 整群抽样六、Systematic Sampling系统抽样七、Convenience Sampling便利抽样八、结论 一、说明 统计学中的抽样类型…...

docker-compose部署java服务

文章目录 一、下载安装docker-compose二、编写Dockerfile文件三、编写docker-compose.yml文件配置说明 四、服务启动五、测试与验证 一、下载安装docker-compose 在安装docker时&#xff0c;并不会同时把docker-compose安装好&#xff0c;需要额外安装一下 下载docker-compos…...

ubuntu22开机自动登陆和开机自动运行google浏览器自动打开网页

一、开机自动登陆 1、打开settings->点击Users 重启系统即可自动登陆桌面 二、开机自动运行google浏览器自动打开网页 1、安装google浏览器 sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i ./google-chrome-stable…...

java接口对接标准

概述 最近在跟许多外部平台对接&#xff0c;遇到了很多问题&#xff0c;在此记录一下接口的对接标准。 接口对接标准 确认环境&#xff0c;分别获取di和prd环境的接口信息&#xff0c;比如域名。确认不同环境的防火墙是否连通。接口校验&#xff0c;接口携带的token信息如何…...

训练的decoder模型文本长度不一致,一般设置为多大合适,需要覆盖最长的文本长度么

在训练解码器模型时,文本长度不一致是常见的情况,需要根据任务的特性和数据集的长度分布来设置合理的最大长度 (max_length)。以下是一些指导原则,帮助你设置合适的最大长度: 1. 是否需要覆盖最长文本长度 覆盖最长文本长度: 如果任务对完整性要求很高(例如生成数学公式、…...

安装MySQL服务

安装版本MySQL8的安装包 安装界面 在这里选择MySQL中的Server only 只安装服务器端 如果选择custom需要如下图 进入配置导向&#xff0c;点击ready to configure&#xff0c;点击next即可 采用默认形式 执行成功后&#xff0c;会出现自动选择项 点击next然后再点击Finish 启动…...

十二、正则表达式、元字符、替换修饰符、手势和对话框插件

1. 正则表达式 1.1 基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&g…...

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…...

如何提升编程能力第二篇

如何提升编程能力2 1. 引言2. 掌握理论基础2.1 理解编程语言的核心2.2 数据结构与算法2.3 计算机基础与系统设计3.1 多写代码3.2 参与开源项目3.3 开发自己的项目 4. 提高代码质量4.1 代码风格与可读性4.2 测试驱动开发 1. 引言 编程是推动现代科技发展的核心技能&#xff0c;…...

【AI日记】24.11.26 聚焦 kaggle 比赛

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 核心工作 1 内容&#xff1a;研究 kaggle 比赛时间&#xff1a;3 小时 核心工作 2 内容&#xff1a;学习 kaggle 比赛 Titanic - Machine Learning from Disaster时间&#xff1a;4 小时备注&#xff1a;这…...

计算机网络八股整理(一)

计算机网络八股文整理 一&#xff1a;网络模型 1&#xff1a;网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型&#xff0c;它由七层组成&#xff0c;从上到下分别是&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;…...

删除链表中的重复元素

删除链表中的重复元素 单链表的创建和使用删除链表中的重复元素 I题目描述解题思路代码实现 删除链表中的重复元素 II题目描述解题思路代码实现 单链表的创建和使用 使用vector结合单链表数据结构创建一个通用单链表。 #include <iostream> #include <vector>str…...

序列求和 牛客网

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 定义S(n) 12 22 … n2&#xff0c;输出S(n) % 1000000007。 注意&#xff1a;1 < n < 1e18。 输入描述: 多组输入&#xff0c;输入直到遇到EOF为止&#xff1b;第一行输…...

【Oracle11g SQL详解】 SELECT 语句的基础用法与示例

SELECT 语句的基础用法与示例 在 Oracle 11g 中&#xff0c;SELECT 语句是最常用的 SQL 语句&#xff0c;用于从数据库表中查询数据。本文将从语法结构、使用方法和常见示例出发&#xff0c;系统讲解 SELECT 语句的基础用法。 一、SELECT 语句的基本语法 SELECT 列名1, 列名2…...

编译以前项目更改在x64下面时报错:函数“PVOID GetCurrentFiber(void)”已有主体

win32下面编译成功&#xff0c;但是x64报错 1>GetWord.c 1>md5.c 这两个文件无法编译 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24125,1): error C2084: 函数“PVOID GetCurrentFiber(void)”已有主体 1>C:\Program Files (x…...

【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子

目录 1 先说结论 2 联合概率 3 边缘概率 4 (行/列)边缘概率的和 总概率1 5 条件概率 5.1 条件概率的除法公式 5.2 条件概率和联合概率区别 1 先说结论 关于独立概率&#xff0c;联合概率&#xff0c;交叉概率&#xff0c;交叉概率和&#xff0c;总概率 类型含义 …...

如何使用 Tailwind CSS 构建响应式网站:详细指南

文章目录 前言一、安装 Tailwind CSS二、配置 Tailwind CSS三、使用 Tailwind CSS 构建响应式网站四、优化和部署结语 前言 在当今的数字时代&#xff0c;网站不仅需要在桌面浏览器上看起来出色&#xff0c;还需要在移动设备和平板电脑上提供一致的用户体验。响应式设计成为了…...

LabVIEW发动机热磨合试验台

在汽车发动机的研发和质量控制中&#xff0c;发动机热磨合试验是关键环节。它能够检验发动机在实际运行条件下的性能&#xff0c;及时发现异响、振动、漏油等潜在问题。通过搭建基于LabVIEW的高效测试平台&#xff0c;可以显著提高发动机的可靠性和使用寿命。下面介绍LabVIEW开…...

【GPT】力量训练是什么,必要吗,有可以替代的方式吗

什么是力量训练&#xff1f; 力量训练是一种通过抵抗力&#xff08;如重量、阻力带、自身体重等&#xff09;来刺激肌肉收缩&#xff0c;从而提高肌肉力量、耐力和体积的运动形式。它包括以下常见形式&#xff1a; 自由重量训练&#xff1a;使用哑铃、杠铃、壶铃等。固定器械…...

pikachu文件上传漏洞通关详解

声明&#xff1a;文章只是起演示作用&#xff0c;所有涉及的网站和内容&#xff0c;仅供大家学习交流&#xff0c;如有任何违法行为&#xff0c;均和本人无关&#xff0c;切勿触碰法律底线 目录 概念&#xff1a;什么是文件上传漏洞一、客户端check二、MIME type三、getimagesi…...

java hashCode() 详解

hashCode() 是 Java 中 Object 类 提供的一个重要方法&#xff0c;它在 Java 集合框架中扮演着关键角色&#xff0c;特别是在使用哈希表相关的集合&#xff08;如 HashMap、HashSet 和 Hashtable&#xff09;时。以下是对 hashCode() 方法的详解&#xff0c;包括概念、用法、规…...

鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)

文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多&#xff0c;跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时&#xff0c;需要解决设备发现、设备认证、设备连接、数据同步等技术难题&#xff0c;不但开发成本高&#xff0c;还存…...

JavaWeb

JavaWeb 一、JavaWeb 是什么&#xff1f;二、JavaWeb 发展阶段三、JavaWeb 常用架构Servlet JSP 架构SSH 架构SSM 架构SpringBoot架构SpringCloud架构 四、JavaWeb 项目结构&#xff08;带web.xml的&#xff09;五、如何打包六、war包部署1. Tomcat 介绍2. Tomcat目录结构3. 开…...

加快发展社会保障事业的必要性

题目 【2011年浙江公务员考试】&#xff08;二&#xff09;某市将召开一次加快发展社会保障事业的形势分析会。会上&#xff0c;某领导要就加快发展社会保障事业的必要性做主题发言。请结合给定资料7~8&#xff0c;为领导拟一份发言要点。&#xff08;25分&#xff09; 要求&a…...

责任链模式在spring security过滤器链中的应用

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象按照顺序处理请求&#xff0c;并且每个对象可以选择自己是否处理该请求或将其传递给下一个对象。 在Spring Security中&#xff0c;责任链模式得到了广泛应…...

Netty基本原理

目录 前言 原生NIO VS Netty 原生NIO存在的问题 Netty的优点 线程模型 传统阻塞 I/O (Blocking I/O) 2. 非阻塞 I/O (Non-blocking I/O) 3. 多路复用 I/O (Multiplexed I/O) 4. Reactor 模式 常见的 Reactor 模式的变体&#xff1a; Netty线程模型 工作原理 前言 N…...

图论入门编程

卡码网刷题链接&#xff1a;98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …...

Haproxy

一、haproxy简介 HAProxy 是法国开发者 威利塔罗 (Willy Tarreau) 在 2000 年使用 C 语言开发的一个开源软件 是一款具备高并发 ( 万级以上 ) 、高性能的 TCP 和 HTTP 负载均衡器 支持基于 cookie 的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及 web 状态统…...

旋转磁体产生的场 - 实验视频资源下载

先发几个视频&#xff0c;是2019年所作的实验内容 更多视频&#xff0c;到某宝找我吧。注意&#xff1a;是收费的。 20190312-180244-旋转磁体产生的场造成激光功率减小 https://download.csdn.net/download/u014161757/90038058 20190313-090956-旋转磁体产生的场对真空介电…...

Java Map

在Java的集合框架中&#xff0c;Map接口用于存储键值对&#xff0c;提供了一种基于键进行查找和操作的数据结构。Map接口的实现类提供了丰富的方法来操作键值对&#xff0c;例如添加、删除、更新和查找。本文将详细介绍Java中的Map接口及其常见实现类&#xff0c;包括HashMap、…...

长三角文博会:Adobe国际认证体系推动设计人才评价新标准

2024年11月22日&#xff0c;由上海、江苏、浙江、安徽三省一市党委宣传部共同发起的第五届长三角文化博览会&#xff08;简称“长三角文博会”&#xff09;在上海国家会展中心盛大启幕。长三角文博会自2018年起已成功举办多届&#xff0c;已成为展示区域文化产业发展成果、推动…...

GoogleTest做单元测试

目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了&#xff0c;解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是&#xff0c;…...

CSDN 博客自动发布脚本(Python 含自动登录、定时发布)

文章目录 关于 csdn auto publisher使用 关于 csdn auto publisher 源码地址&#xff1a;https://github.com/ezscode/csdn_auto_publisher 使用 def test_simple_pub():file_path /Users/xx/Documents/xxx/tool.md article Article(file_path) article.tags [python] art…...

RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程

这是一篇基于RL78/G15 Fast Prototyping Board的Arduino IDE开发记录 RL78/G15 Fast Prototyping Board硬件简介&#xff08;背景&#xff09;基础测试&#xff08;方法说明/操作说明&#xff09;开发环境搭建&#xff08;方法说明/操作说明代码结果&#xff09;Arduino IDE RL…...

VsCode 插件推荐(个人常用)

VsCode 插件推荐&#xff08;个人常用&#xff09;...

零基础学安全--云技术基础

目录 学习连接 前言 云技术历史 云服务 公有云服务商 云分类 基础设施即服务&#xff08;IaaS&#xff09; 平台即服务&#xff08;PaaS&#xff09; 软件即服务&#xff08;SaaS&#xff09; 云架构 虚拟化 容器 云架构设计 组件选择 基础设施即代码 集成部署…...

docker如何安装redis

第一步 如果未指定redis&#xff0c;则安装的是最新版的 docker pull redis 创建一个目录 mkdir /usr/local/docker/redis 然后直接可以下载redis&#xff0c;这是方式确实不怎么好&#xff0c;应该找在官网上找对应的redis配置文件 wget http://download.redis.io/redis-stab…...

搜维尔科技:仿人双臂遥操作系统,力反馈灵巧手操作解决方案

仿人双臂遥操作系统&#xff0c;力反馈灵巧手操作解决方案 搜维尔科技&#xff1a;仿人双臂遥操作系统&#xff0c;力反馈灵巧操作解决方案...

C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)

目录 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口&#xff08;同向双指针&#xff09; 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口 题目&#xff1a; 无重复字符的最长子串 1. 题目解析 题目截图&#xff1a; 此题所说的…...

R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法

R语言绘图过程中遇到图例的图块中出现字符的解决方法 因为我遇到这个问题的时候没在网上找到合适的方法&#xff0c;找到个需要付费的&#xff0c;算了。也许是因为问的方式不同&#xff0c;问了半天AI也回答出来&#xff0c;莫名有些烦躁&#xff0c;打算对代码做个分析&…...

海康面阵、线阵、读码器及3D相机接线说明

为帮助用户快速了解和配置海康系列设备的接线方式&#xff0c;本文将针对海康面阵相机、线阵相机、读码器和3D相机的主要接口及接线方法进行全面整理和说明。 一、海康面阵相机接线说明 海康面阵相机使用6-pin P7接口&#xff0c;其功能设计包括电源输入、光耦隔离信号输入输出…...

Lua--1.基础知识

Lua基础知识 变量简单的4种变量类型复杂的4种变量类型type函数 字符串操作长度获取--#多行打印字符串拼接别的类型转字符串-- tostring()字符串提供的公共方法 运算符算术运算符-- - * / % ^条件运算符-- > < > < ~(不等于 是 ~)逻辑运算符-- and or not位运算、…...

从Full-Text Search全文检索到RAG检索增强

从Full-Text Search全文检索到RAG检索增强 时光飞逝&#xff0c;转眼间六年过去了&#xff0c;六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目&#xff0c;铁蛋也从最开始做CRUD转行去了大数据平台开发&#xff0c;混迹包装开源的业务&#xff0c;机缘巧合下做了实时…...

Qt桌面应用开发 第八天(读写文件 文件编码 文件流)

目录 1.读文件 2.写文件及编码格式 2.1写文件 2.2编码格式 3.文件信息读取 4.文件流 4.1QTextStream 4.2QDataStream 1.读文件 需求&#xff1a;一个pushButton&#xff0c;点击之后可以选择一个txt文件的路径&#xff0c;路径会显示在lineEdit上&#xff0c;txt文件的…...

玩转 Burp Suite (1)

内容预览 ≧∀≦ゞ 玩转 Burp Suite (1)声明Burp Suite 简介Dashboard&#xff08;仪表盘&#xff09;1. 默认任务管理2. 暂停任务3. 新建扫描任务4. 使用总结 Target&#xff08;目标&#xff09;1. SIte Map &#xff08;站点地图&#xff09;2. Scope&#xff08;范围&#…...