基于 Rust 与 GBT32960 规范的编解码层
根据架构设计,实现编解码层的代码设计
Cargo.toml 加入二进制序列化支持
# 序列化支持
...
bincode = "1.3" # 添加二进制序列化支持
bytes-utils = "0.1" # 添加字节处理工具
开始编码
错误处理(error.rs):
定义了编解码过程中可能遇到的错误类型,使用枚举定义
use thiserror::Error;#[derive(Error, Debug)]
pub enum CodecError {#[error("数据长度不足")]InsufficientData,#[error("校验和错误")]ChecksumMismatch,#[error("无效的起始符")]InvalidStartByte,#[error("无效的命令标识: {0}")] InvalidCommand(u8),#[error("IO错误: {0}")] Io(#[from] std::io::Error),
}
数据帧结构(frame.rs):
- 定义了符合 GBT32960 协议的数据帧结构
- 提供了创建和校验数据帧的方法
frame.rs
use bytes::{ Bytes, BytesMut, BufMut };
use chrono::NaiveDateTime;
use serde::{ Serialize, Deserialize };#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Frame {pub start_byte: u8, // 起始符 0x23pub command_flag: u8, // 命令标识pub response_flag: u8, // 应答标志pub vin: String, // 车辆识别码pub encrypt_method: u8, // 加密方式pub payload_length: u16, // 数据单元长度pub payload: Bytes, // 数据单元pub checksum: u8, // BCC校验码
}impl Frame {pub fn new(command: u8, vin: String, payload: Bytes) -> Self {let payload_length = payload.len() as u16;Self {start_byte: 0x23,command_flag: command,response_flag: 0xfe,vin,encrypt_method: 0x01,payload_length,payload,checksum: 0x00, // 将在编码时计算}}pub fn calculate_checksum(&self) -> u8 {let mut bcc: u8 = 0;// 命令标识bcc ^= self.command_flag;// 应答标志bcc ^= self.response_flag;// VIN码(17位)for byte in self.vin.as_bytes() {bcc ^= byte;}// 加密方式bcc ^= self.encrypt_method;// 数据单元长度(2字节)bcc ^= ((self.payload_length >> 8) & 0xff) as u8;bcc ^= (self.payload_length & 0xff) as u8;// 数据单元for byte in self.payload.iter() {bcc ^= byte;}bcc}
}#[cfg(test)]
mod tests {use super::*;#[test]fn test_calculate_checksum() {let payload = Bytes::from_static(&[0x01, 0x02, 0x03]);let frame = Frame::new(0x01, // command"LSVNV2182E0200001".to_string(), // vinpayload);let checksum = frame.calculate_checksum();assert!(checksum != 0, "校验和不应该为0");// 创建相同内容的帧,校验和应该相同let frame2 = Frame::new(0x01,"LSVNV2182E0200001".to_string(),Bytes::from_static(&[0x01, 0x02, 0x03]));assert_eq!(checksum, frame2.calculate_checksum(), "相同内容的帧应该有相同的校验和");}#[test]fn test_different_content_different_checksum() {let frame1 = Frame::new(0x01, "LSVNV2182E0200001".to_string(), Bytes::from_static(&[0x01]));let frame2 = Frame::new(0x01, "LSVNV2182E0200001".to_string(), Bytes::from_static(&[0x02]));assert_ne!(frame1.calculate_checksum(),frame2.calculate_checksum(),"不同内容的帧应该有不同的校验和");}
}
编解码器(codec.rs):
- 实现了 tokio 的 Decoder 和 Encoder trait
- 负责数据帧的序列化和反序列化
use bytes::{ BytesMut, Buf };
use tokio_util::codec::{ Decoder, Encoder };
use super::{ Frame, CodecError };pub struct Gbt32960Codec;impl Decoder for Gbt32960Codec {type Item = Frame;type Error = CodecError;fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {// 检查数据长度是否足够if src.len() < 22 {// 最小帧长度return Ok(None);}// 检查起始符if src[0] != 0x23 {return Err(CodecError::InvalidStartByte);}// TODO: 实现完整的解码逻辑// 1. 读取各个字段// 2. 验证校验和// 3. 解析数据单元Ok(None)}
}impl Encoder<Frame> for Gbt32960Codec {type Error = CodecError;fn encode(&mut self, frame: Frame, dst: &mut BytesMut) -> Result<(), Self::Error> {// TODO: 实现编码逻辑// 1. 写入各个字段// 2. 计算并写入校验和Ok(())}
}
实现完整的解码逻辑
use bytes::{BytesMut, Buf, BufMut};
use tokio_util::codec::{Decoder, Encoder};
use super::{Frame, CodecError};pub struct Gbt32960Codec;impl Decoder for Gbt32960Codec {type Item = Frame;type Error = CodecError;fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {// 检查数据长度是否足够if src.len() < 22 { // 最小帧长度return Ok(None);}// 检查起始符if src[0] != 0x23 {return Err(CodecError::InvalidStartByte);}// 读取命令标识和应答标志let command_flag = src[1];let response_flag = src[2];// 读取 VIN 码(17字节)let vin = String::from_utf8_lossy(&src[3..20]).to_string();// 读取加密方式let encrypt_method = src[20];// 读取数据单元长度(2字节)let payload_length = ((src[21] as u16) << 8) | (src[22] as u16);// 检查是否有足够的数据let total_length = 23 + payload_length as usize + 1; // 头部 + 数据单元 + 校验码if src.len() < total_length {return Ok(None);}// 读取数据单元let payload = src.slice(23..23 + payload_length as usize);// 读取校验码let received_checksum = src[total_length - 1];// 创建帧对象进行校验和计算let frame = Frame {start_byte: 0x23,command_flag,response_flag,vin,encrypt_method,payload_length,payload: payload.freeze(),checksum: received_checksum,};// 验证校验和let calculated_checksum = frame.calculate_checksum();if calculated_checksum != received_checksum {return Err(CodecError::ChecksumMismatch);}// 消费已处理的字节src.advance(total_length);Ok(Some(frame))}
}impl Encoder<Frame> for Gbt32960Codec {type Error = CodecError;fn encode(&mut self, frame: Frame, dst: &mut BytesMut) -> Result<(), Self::Error> {// TODO: 实现编码逻辑// 1. 写入各个字段// 2. 计算并写入校验和Ok(())}
}#[cfg(test)]
mod tests {use super::*;use bytes::Bytes;#[test]fn test_decode_valid_frame() {let mut codec = Gbt32960Codec;let mut buffer = BytesMut::new();// 构造测试数据buffer.put_u8(0x23); // 起始符buffer.put_u8(0x01); // 命令标识buffer.put_u8(0xFE); // 应答标志buffer.extend_from_slice(b"LSVNV2182E0200001"); // VIN码buffer.put_u8(0x01); // 加密方式buffer.put_u16(2); // 数据长度buffer.extend_from_slice(&[0x01, 0x02]); // 数据单元// 计算并添加校验和let checksum = buffer[1..buffer.len()].iter().fold(0u8, |acc, &x| acc ^ x);buffer.put_u8(checksum);// 解码let result = codec.decode(&mut buffer).unwrap().unwrap();// 验证解码结果assert_eq!(result.command_flag, 0x01);assert_eq!(result.vin, "LSVNV2182E0200001");assert_eq!(result.payload.len(), 2);assert_eq!(buffer.len(), 0); // 确保所有数据都被消费}#[test]fn test_decode_invalid_checksum() {let mut codec = Gbt32960Codec;let mut buffer = BytesMut::new();// 构造测试数据(使用错误的校验和)buffer.put_u8(0x23);buffer.put_u8(0x01);buffer.put_u8(0xFE);buffer.extend_from_slice(b"LSVNV2182E0200001");buffer.put_u8(0x01);buffer.put_u16(0);buffer.put_u8(0xFF); // 错误的校验和// 验证解码失败assert!(matches!(codec.decode(&mut buffer),Err(CodecError::ChecksumMismatch)));}
}
代码地址
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
总结
1. 完整的帧解析逻辑:
- 起始符验证,根据接口协议验证是否0x23开头
- 命令标识和应答标志解析
- VIN码解析,vin码17个字节长度
- 加密方式解析,读取加密方式,测试的时候可以先不使用,上生产环境后要打开
- 数据单元长度解析,表示数据payload的总长度
- 数据单元提取
- 校验和验证
2. 数据完整性检查:
- 最小帧长度检查
- 完整数据长度检查
- 校验和验证
3. 添加了单元测试:
- 测试有效帧的解码
- 测试校验和错误的情况
相关文章:
基于 Rust 与 GBT32960 规范的编解码层
根据架构设计,实现编解码层的代码设计 Cargo.toml 加入二进制序列化支持 # 序列化支持 ... bincode "1.3" # 添加二进制序列化支持 bytes-utils "0.1" # 添加字节处理工具 开始编码 错误处理(error.rs&#x…...
二、Redis 安装与基本配置:全平台安装指南 服务器配置详解
Redis 安装与基本配置:全平台安装指南 & 服务器配置详解 Redis 作为高性能的内存数据库,其安装和配置是使用 Redis 的第一步。本篇文章将全面介绍 Redis 的安装方式,覆盖 Windows、Linux、Docker 环境,并详细讲解 Redis 的基础配置,包括 持久化、日志、端口设置等。此…...
⭐算法OJ⭐矩阵的相关操作【动态规划 + 组合数学】(C++ 实现)Unique Paths 系列
文章目录 62. Unique Paths动态规划思路实现代码复杂度分析 组合数学思路实现代码复杂度分析 63. Unique Paths II动态规划定义状态状态转移方程初始化复杂度分析 优化空间复杂度状态转移方程 62. Unique Paths There is a robot on an m x n grid. The robot is initially lo…...
基于 Elasticsearch 和 Milvus 的 RAG 运维知识库的架构设计和部署落地实现指南
最近在整理一些业务场景的架构设计和部署落地实现指南 先放一个 【基于RAG的运维知识库 (ElasticSearch + Milvus) 的详细实现指南】,其中包含了详尽的技术实现细节、可运行的示例代码、原理分析、优缺点分析和应用场景分析。 架构描述: 基于RAG的运维知识库 (ElasticSearch…...
山西青年杂志山西青年杂志社山西青年编辑部2025年第3期目录
青年争鸣 教师发展中心行动转向的价值意蕴分析框架研究与启示 于宝证;李军红;郑钰莹;何易雯; 产教融合视角下职业本科工商管理专业人才培养模式探析 杜芯铭; 青年教育研究 教育数字化背景下高职院校的课堂教学研究 张晨; 统筹职业教育、高等教育、继续教育协同…...
使用Truffle、Ganache、MetaMask、Vue+Web3完成的一个简单区块链项目
文章目录 概要初始化Truffle项目创建编写合约编译合约配置Ganache修改truffle-config.js文件编写迁移文件部署合约使用Truffle 控制台使用MetaMask和VueWeb3与链交互 概要 使用Truffle、Ganache、MetaMask、VueWeb3完成的一个简单区块链项目。 初始化Truffle项目 安装好truf…...
【GenBI优化】提升text2sql准确率:建议使用推理大模型,增加重试
引言 Text-to-SQL(文本转 SQL)是自然语言处理(NLP)领域的一项重要任务,旨在将自然语言问题自动转换为可在数据库上执行的 SQL 查询语句。这项技术在智能助手、数据分析工具、商业智能(BI)平台等领域具有广泛的应用前景,能够极大地降低数据查询和分析的门槛,让非技术用…...
LLVM - 编译器前端 - 学习将源文件转换为抽象语法树(二)
一:处理消息 在一个庞大的软件(比如编译器)中,我们不希望将消息字符串分散在各个地方。如果需要修改消息内容或将其翻译成另一种语言,最好将它们集中存放在一个地方!目前缺少的是对消息的集中定义。下面我们看看来如何实现它。 一种简单的方法是,每条消息都有一个 ID(一…...
T-SQL 语言基础: SQL 数据库对象元数据及配置信息获取
目录 介绍目录视图 获取表和架构名称获取列信息 信息架构视图 获取表信息获取列信息 系统存储过程和函数 获取对象列表获取对象详细信息获取约束信息获取数据库属性信息 总结引用 介绍 在 SQL 数据库管理中,获取数据库对象的元数据信息是至关重要的。元数据提供了…...
基于vue框架的游戏博客网站设计iw282(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,博客信息,资源共享,游戏视频,游戏照片 开题报告内容 基于FlaskVue框架的游戏博客网站设计开题报告 一、项目背景与意义 随着互联网技术的飞速发展和游戏产业的不断壮大,游戏玩家对游戏资讯、攻略、评测等内容的需求日…...
批量提取 Word 文档中的页面
如何将 Word 文档中的页面提取出来形成一个新的文档呢?比如将 Word 文档中的第一页提取出来、将 Word 文档中的最后一页提取出来、再或者将 Word 文档中的中间几页提取出来等等。人工的处理肯定非常的麻烦,需要新建 Word 文档,然后将内容复制…...
本地大模型编程实战(26)用langgraph实现基于SQL数据构建的问答系统(5)
本文将将扩展上一篇文章完成的 langgraph 链,继续使用基于 langgraph 链 ,对结构化数据库 SQlite 进行查询的方法。该系统建立以后,我们不需要掌握专业的 SQL 技能,可以用自然语言询问有关数据库中数据的问题并返回答案。主要完善…...
csrf与ssrf学习笔记
一、CSRF(Cross-Site Request Forgery) 1. 定义 攻击目标:利用用户已登录的合法身份,在用户不知情的情况下发起恶意请求。 核心条件:受害者需已登录目标系统,且浏览器会自动携带身份凭证(如 C…...
安装Maven配置阿里云地址 详细教程
下面以安装Maven公认最稳定版本(使用最多)3.6.1为例 1、访问maven官网 Maven官网 直接跳转Maven3.6.1 Maven3.6.1 2、点击下载 跳转页面后继续单击 Maven 3 archives 下载后解压放到自己的软件目录下 ~ 2.配置本地仓库 在目录下创建repo文件夹 &…...
我的世界1.20.1forge模组开发进阶物品(7)——具有动画、3D立体效果的物品
基础的物品大家都会做了对吧?包括武器的释放技能,这次来点难度,让物品的贴图呈现动画效果和扔出后显示3D立体效果,这个3D立体效果需要先学习blockbench,学习如何制作贴图。 Blockbench Blockbench是一个用于创建和编辑三维模型的免费软件,特别适用于Minecraft模型的设计…...
火语言RPA--PDF提取表格
【组件功能】:提取PDF文档指定位置表格 配置预览 配置说明 文件路径 支持T或# 默认FLOW输入项 待提取表格的PDF文件的完整路径。 提取位置 全部、指定页、指定范围3种位置供选择。 PDF文件密码 支持T或# 打开PDF文件的密码。 页码 支持T或# 提取指定页的页…...
【开源-线程池(Thread Pool)项目对比】
一些实现**线程池(Thread Pool)**功能的开源项目的对比分析。 线程池功能的开源项目 项目名称语言优点缺点适用场景开源代码链接ThreadPoolC简单易用,代码简洁;适合快速原型开发。功能较为基础,不支持动态调整线程数…...
JavaScript系列05-现代JavaScript新特性
JavaScript作为网络的核心语言之一,近年来发展迅速。从ES6(ECMAScript 2015)开始,JavaScript几乎每年都有新的语言特性加入,极大地改善了开发体验和代码质量。本文主要内容包括: ES6关键特性:解构赋值与扩展运算符&am…...
【二.提示词工程与实战应用篇】【3.Prompt调优:让AI更懂你的需求】
最近老张在朋友圈秀出用AI生成的国风水墨画,隔壁王姐用AI写了份惊艳全场的年终总结,就连楼下小卖部老板都在用AI生成营销文案。你看着自己跟AI对话时满屏的"我不太明白您的意思",是不是怀疑自己买了台假电脑?别慌,这可能是你的打开方式不对。今天咱们就聊聊这个…...
C++学习之C++初识、C++对C语言增强、对C语言扩展
一.C初识 1.C简介 2.第一个C程序 //#include <iostream> //iostream 相当于 C语言下的 stdio.h i - input 输入 o -output 输出 //using namespace std; //using 使用 namespace 命名空间 std 标准 ,理解为打开一个房间,房间里有我们所需…...
基于eRDMA实测DeepSeek开源的3FS
DeepSeek昨天开源了3FS分布式文件系统, 通过180个存储节点提供了 6.6TiB/s的存储性能, 全面支持大模型的训练和推理的KVCache转存以及向量数据库等能力, 每个客户端节点支持40GB/s峰值吞吐用于KVCache查找. 发布后, 我们在阿里云ECS上进行了快速的复现, 并进行了性能测试, ECS…...
写Oracle表耗时25分钟缩短到23秒——SeaTunnel性能优化
本文主要给大家介绍JDBC Source批处理任务动态切分优化,希望大家批评指正 JDBC Source 如果配置了table_path 和 partition_column,引擎会对数据进行动态切分,可以通过分析样本数据优化切分区间,规避数据倾斜问题。 目前发现任务…...
Golang的图形用户界面设计
一、Golang图形用户界面设计的基本概念 了解Golang 也称为Go语言,是一种由Google开发的开源编程语言。它具有良好的并发性,能够更好地利用多核处理器,同时也拥有丰富的标准库和强大的工具链。 什么是图形用户界面 图形用户界面(GU…...
蓝桥杯备赛Day12 动态规划1基础
动态规划 动态规划基础 动态规划将复杂问题分解成很多重叠的子问题,再通过子问题的解得到整个问题的解 分析步骤: 确定状态:dp[i][j]val,“到第i个为止,xx为j的方案数/最小代价/最大价值” 状态转移方程: 确定最终状态 要求: (1)最优子结构 (2)无后效性…...
我的AI工具箱Tauri版-通用音频转文本
本模块支持FunAsr和FasterWhisper两种模式,可批量处理音频与视频文件,自动生成txt文本与srt字幕,满足多种应用场景需求。 工具内置FunAsr,无需额外参数调整,特别适用于中文语音的高质量转录,确保识别准确率…...
C#—Settings配置详解
C#—Settings配置详解 在C#项目中,全局配置通常指的是应用程序的设置(settings),这些设置可以跨多个类或组件使用,并且通常用于存储应用程序的配置信息,如数据库连接字符串、用户偏好设置等。 Settings配置…...
机器学习算法——分类任务
算法: 1、决策树 2、随机森林 3、梯度提升树 4、逻辑回归 5、支持向量机SVM 6、K近邻 KNN 7、朴素贝叶斯 8、多层感知机 9、统一分类 10、比较总结 11、完整代码 1、决策树 1.1 Decision Tree Analysis (C4.5,CART,CHAID)决策树 算法树结构特征选择连续值处理缺失…...
聆听PostgreSQL数据库的使用
参考:(1)零基础入门PostgreSQL教程 (2)菜鸟教程 文章目录 一、PostgreSQL是什么?二、基本使用1.下载2.操作(1)数据库(2)表 一、PostgreSQL是什么?…...
C# 装箱(Boxing)与拆箱(Unboxing)
C# 装箱(Boxing)与拆箱(Unboxing) 在 C# 中,装箱和拆箱是与值类型(如结构体)和引用类型(如类)之间的转换相关的操作。它们是类型系统的一部分,但如果不正确使…...
vue实例
// vue应用通过createApp函数创建一个新的应用实例,相当于根组件 import { createApp } from vue import App from ./App.vue // 在一个vue项目当中,有且只有一个vue的实例对象 const appcreateApp(App) // App:根组件 // 实例必须调用了.mount&am…...
Spring Boot的启动流程
Spring Boot 的启动流程是一个复杂且有序的过程: 创建SpringApplication实例 — 调用run方法 — 启动完成(发布应用启动事件,配置环境,创建ApplicationContext,准备ApplicationContext,刷新ApplicationContext[【创建B…...
springboot整合pagehelper实现mybatis分页
1.依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.0</version></dependency><dependency><groupId>com.github.pagehelper<…...
Qt信号与槽机制
Qt信号与槽机制(Signal and Slot Mechanism)是Qt框架中用于对象间通信的一种机制。信号和槽是Qt的核心特性之一,它们允许对象在特定事件发生时发送信号,并由其他对象通过槽函数进行响应。这种机制不仅简化了对象间的通信&…...
Qt空项目代码解释
一、 背景 创建的是一个 QWidget 项目。 二、main.cpp 1、图片 2、代码解释 (1)QApplication Qt 图形化界面中一定有 QApplication (2)Widget w; 是 QWidget 的子类。 (3)w.show(); 继承父类的显示…...
【Git】版本控制系统Git命令详解
2024.06.06 2024.06.06\ 2024.06.06 Resources 强推:Pro Git - Book (git-scm.com).中文版. 强烈推荐网址:https://learngitbranching.js.org/?localezh_CN. LearnGit Game: 基础(Git 主要命令) Git Commit&#…...
Java【多线程】(2)线程属性与线程安全
目录 1.前言 2.正文 2.1线程的进阶实现 2.2线程的核心属性 2.3线程安全 2.3.1线程安全问题的原因 2.3.2加锁和互斥 2.3.3可重入(如何自己实现可重入锁) 2.4.4死锁(三种情况) 2.4.4.1第一种情况 2.4.4.2第二种情况 2.4…...
浅克隆与深克隆区别
package d12_api_object;public class Test2 {public static void main(String[] args) throws CloneNotSupportedException {//目标:掌握Object类提供的对象克隆方法//1、protected Object clone():对象克隆User u1 new User(1,"min","1120",…...
【计算机网络入门】初学计算机网络(九)
目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术,多个主机形成…...
数列极限入门习题
数列极限入门习题 lim n → ∞ ( 1 1 2 1 3 ⋯ 1 n ) 1 n \lim\limits_{n\rightarrow\infty}(1 \frac{1}{2}\frac{1}{3}\cdots\frac{1}{n})^{\frac{1}{n}} n→∞lim(12131⋯n1)n1 lim n → ∞ ( 1 n 1 1 n 2 ⋯ 1 n n ) \lim\limits_{n\rightarrow\…...
【决策树】分类属性的选择
文章目录 1.信息增益(ID3)2.信息增益率(C4.5)3.基尼指数(CART)ps.三者对比 实现决策树算法最关键的一点就是如何从所有的特征属性中选择一个最优的属性对样本进行分类,这种最优可以理解为希望划…...
Mysql面试篇笔记:
优化: 1.如何定位慢查询: 首先压测接口,查看那个接口比较慢,可以通过多种工具,比如Skywaking 可以查看各个接口响应时间,查看接口最慢,然后去跟踪接口,查看详细信息&#…...
005-Docker 安装 Redis
Docker 安装 Redis 1.从镜像官网拉取Redis镜像2.创建实例并启动3.测试连接4.设置开机启动 1.从镜像官网拉取Redis镜像 镜像官网地址:https://hub.docker.com执行命令 -- 拉取最新的版本 docker pull redis查看镜像 docker images2.创建实例并启动 先创建好需要的…...
可终身授权的外国工具,不限次数使用!PDF转CAD的软件
最近有不少朋友问我有没有好用的CAD转换工具,今天就来给大家分享两款超实用的小软件,希望能帮到大家。 第一款软件是一款国外开发的,它专门用来把PDF文件转换成CAD格式,特别方便。 这款软件的操作非常简单,打开后无需安…...
GaussDB性能调优技术指南
一、性能调优核心目标 降低响应时间:缩短单次查询或事务的处理时间(如从秒级优化到毫秒级)。 提高吞吐量:支撑更高并发请求(如从千次/秒提升到百万次/秒)。 资源高效利用:减少 CPU、…...
iOS逆向工程专栏 第13篇:iOS动态分析基础
iOS逆向工程专栏 第13篇:iOS动态分析基础 引言 在前面的文章中,我们详细探讨了iOS系统架构、逆向开发环境搭建、Mach-O文件格式分析,以及各种静态分析工具和技术。通过静态分析,我们可以了解应用的结构、类和方法定义,以及基本的控制流程。然而,静态分析也存在明显的局…...
【现代深度学习技术】卷积神经网络03:填充和步幅
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
(链表 删除链表的倒数第N个结点)leetcode 19
设空结点指向head便于插入和删除结点 考虑特殊情况 head结点被删除 a结点仅用来测试长度,找到目标结点的位置 b结点为空结点指向head返回值 cur用来删除目标值(特殊情况 目标值为head 这时curb) 则开始就将cur初始化为b开始遍历 /*** Definition fo…...
初阶数据结构(C语言实现)——3顺序表和链表(2)
2.3 数组相关面试题 原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。OJ链接 力扣OJ链接-移除元素删除排序数组中的重复项。力扣OJ链接-删除有序数组中的重复项合并两个有序数组。力扣OJ链接-合并两个有序数组 2.3.1 移除元素 1…...
leetcode 138. 随机链表的复制
题目如下 数据范围 这道题十分好,一定要自己写看看再来看别人的答案! 首先复制题目给出的链表,对于每个新生成的node利用名为ri的map记录它们在链表的位置和指针。 接着利用名为rd的map存储每个链表中random对应的位置比如(0,…...
【OpenCV C++】以时间命名存图,自动检查存储目录,若不存在自动创建, 按下空格、回车、Q、S自动存图
文章目录 // 保存图像的函数 void saveImage(const cv::Mat& frame) {// 生成唯一文件名auto now = std::chrono::system_clock::...