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

【Linux】自定协议和序列化与反序列化

目录

一、序列化与反序列化概念

二、自定协议实现一个加法网络计算器

(一)TCP如何保证接收方的接收到数据是完整性呢?

(二)自定义协议

(三)自定义协议的实现

1、基础类

2、序列化与反序列化

3、报头的增删

4、从缓冲区内提取完整报文

5、自定协议在服务器与客户端的实现

三、使用Json进行序列化和反序列化

(一)概念

(二)Json的安装

(三)针对序列化和反序列化的改造


一、序列化与反序列化概念

        在之前的文章中,我们调用网络接口进行数据传输时都是使用字符串作为数据直接进行传输的,但是在一些场景中单个字符串是不能满足需要的,可能需要一个结构体或是数据结构,那么如何将结构体或数据结构进行网络传输呢?

        序列化:将数据结构或对象转换为字节流,以便它们可以存储到磁盘上、通过网络传输或在不同的程序间共享;

        反序列化:存储的字节流或文本数据重新转换为原来的数据结构或对象。这个过程用于恢复存储的或传输的数据,以便程序能再次使用它。

        当我们需要发送一个结构体时,我们可以先将其进行序列化转换为字节流再进行网络传输,而接收方可以通过将其反序列化从而恢复传输的数据,以此达到数据传输的目的。

二、自定协议实现一个加法网络计算器

(一)TCP如何保证接收方的接收到数据是完整性呢?

       UDP是面向数据报,而TCP是面向字节流的。

        在UDP协议传输数据时,由于数据的发送和接收都是按数据报的格式进行的,每个数据报是独立传输的。虽然UDP协议本身不保证数据的完整性和可靠性,但在网络传输没有出现丢包或错误的情况下,数据是完整的。

        但在使用TCP协议传输数据时,由于数据的发送和接收都是按字节流的形式进行的,发送和接收到的数据不一定是完整的,假如TCP的服务端读取速度小于TCP客户端的发送速度,那么在缓冲区一定堆积了大量的报文,那么如何从缓冲区内提取到一条完整的报文数据呢?

        其实我们调用接口进行网络数据传输本质实际是拷贝。发送方发送数据,接收方接收数据,本质实际是发送方缓冲区内容拷贝给接收方缓冲区。

        对于上述的问题,如果发送方发送数据的速度过快,导致接收方缓冲区内堆积了大量的报文,那么如何从大量数据中提取出一个完整的报文呢?

        实际上可以定制协议,以下是协议设计方式:

  • 定长(规定每个报文的固定长度)
  • 特殊符合(在报文之间加上特殊符合用于分割报文)
  • 自描述方式(数据本身描述其格式、大小等)

(二)自定义协议

        本文采用自描述方式设计自定协议:

        首先本文是针对加法计算器而做的协议,而这个协议不仅要包括数据的序列化和反序列化,还要有增添减少报头分割符的接口。除此之外,因为使用面向字节流进行输出,还要保证如何从缓冲区内提取一个完整的结构。

(三)自定义协议的实现

1、基础类

class Request
{
public:int _x;    //左操作数int _y;    //右操作数char _op;  //操作符
};
class Response
{
public:int _exitcode;  //退出码int _result;    //计算结果
};

2、序列化与反序列化

class Request
{
public:Request() {}Request(int x, int y, char op) : _x(x), _y(y), _op(op) {}//序列化bool serialize(string &out){out.clear();out += to_string(_x);out += SEP;out += _op;out += SEP;out += to_string(_y);return true;}//反序列化bool deserialize(const string &in){auto left = in.find(SEP);auto right = in.rfind(SEP);if (left == string::npos || right == string::npos || left == right)return false;if (right - left - SEP_LEN != 1)return false;string x_string = in.substr(0, left);string y_string = in.substr(right + SEP_LEN);if (x_string.empty() || y_string.empty())return false;_x = stoi(x_string);_y = stoi(y_string);_op = in[left + SEP_LEN];return true;}
public:int _x;int _y;char _op;
};
class Response
{
public:Response() {}Response(int exitcode, int result) : _exitcode(exitcode), _result(result) {}//序列化bool serialize(string &out){out.clear();out += to_string(_exitcode);out += SEP;out += to_string(_result);return true;}//反序列化bool deserialize(const string &in){auto index = in.find(SEP);if (index == string::npos)return false;string code = in.substr(0, index);string result = in.substr(index + SEP_LEN);if (code.empty() || result.empty())return false;_exitcode = stoi(code);_result = stoi(result);return true;}
public:int _exitcode;int _result;
};

3、报头的增删

#define SEP " "
#define SEP_LEN strlen(SEP)
#define SEP_LINE "\r\n"
#define SEP_LINE_LEN strlen(SEP_LINE)
//"text_len/r/text/r/n"
//增添报头
bool enLength(string &text)
{if (text.empty())return false;int len = text.size();string len_string = to_string(len);if (len_string.empty())return false;string ret;ret += len_string;ret += SEP_LINE;ret += text;ret += SEP_LINE;text = ret;return true;
}
//删除报头
bool deLength(const string &package, string &text)
{auto index = package.find(SEP_LINE);if (index == string::npos)return false;string len_string = package.substr(0, index);int len = stoi(len_string);text.clear();text = package.substr(index + SEP_LINE_LEN, len);return true;
}

4、从缓冲区内提取完整报文

bool recvPackage(const int &fd, string &inbuffer, string &text)
{while (true){char buffer[1024];ssize_t n = recv(fd, buffer, sizeof(buffer) - 1, 0);if (n > 0){buffer[n] = 0;inbuffer += buffer;auto index = inbuffer.find(SEP_LINE);string len_string = inbuffer.substr(0, index);int len = stoi(len_string);int total = len + SEP_LINE_LEN * 2 + len_string.size();if (inbuffer.size() < total){cout << "正在等待后续消息" << endl;continue;}text = inbuffer.substr(0, total);inbuffer.erase(0, total);break;}elsereturn false;}return true;
}

5、自定协议在服务器与客户端的实现

//服务端
void handlerEntery(const int &fd, func_t func){string inbuffer;while (1){// 收到ReqRequest req;string req_str, req_text;if (recvPackage(fd, inbuffer, req_str) == false)return;// 去报头cout << "接收数据:" << req_str << endl;bool ret = deLength(req_str, req_text);if (ret == false)logMessage(ERROR, "Server : deLength fail");cout << "接收数据正文:" << req_text << endl;// 反序列化ret = req.deserialize(req_text);if (ret == false)logMessage(ERROR, "Server : deserialize fail");// 计算Response resp;func(req, resp);// 序列化string resp_text;ret = resp.serialize(resp_text);if (ret == false)logMessage(ERROR, "Server : deserialize fail");cout << "发送数据:" << resp_text << endl;// 加报头ret = enLength(resp_text);if (ret == false)logMessage(ERROR, "Server : enLength fail");cout << "发送数据正文:" << resp_text << endl;// 发送Respsend(fd, resp_text.c_str(), resp_text.size(), 0);}}
//客户端
void run(){struct sockaddr_in addr;bzero(&addr, 0);addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(_Sip.c_str());addr.sin_port = htons(_Sport);if (connect(_fd, (struct sockaddr *)&addr, sizeof(addr)) == -1){cerr << strerror(errno) << endl;exit(2);}else{string inbuffer;while (true){// 读取数据string line;cout << " please input#\n";getline(cin, line);Request req = parseLine(line);// 序列化string req_text;bool ret = req.serialize(req_text);if (ret == false)logMessage(ERROR, "Client : serialize fail");// 加报头ret = enLength(req_text);if (ret == false)logMessage(ERROR, "Client : enLength fail");// 发数据send(_fd, req_text.c_str(), req_text.size(), 0);// 接收数据string resp_str, resp_text;if (!recvPackage(_fd, inbuffer, resp_str))continue;// 去报头ret = deLength(resp_str, resp_text);if (ret == false)logMessage(ERROR, "Client : deLength fail");// 反序列化Response resp;ret = resp.deserialize(resp_text);if (ret == false)logMessage(ERROR, "Client : deserialize fail");cout << "exitcode :" << resp._exitcode << "\tresulet : " << resp._result << endl;}}}

三、使用Json进行序列化和反序列化

(一)概念

        从上文可以得知,手动进行序列化和反序列化非常繁杂。实际上我们可以使用现成的方案。

        Json是一种轻量级的数据交换格式,广泛用于网络应用中,尤其是在客户端与服务器之间的数据交换。它易于阅读和编写,同时也便于机器解析和生成。

(二)Json的安装

        首先登录云服务器后输入指令:

sudo yum install -y jsonapp-devel

        使用Json除了需要引入头文件以外还需要在编译中加入 -ljsoncpp 选项。

#include <jsoncpp/json/json.h>
g++ -g -o Server Server.cpp -std=c++11 -ljsoncpp

(三)针对序列化和反序列化的改造

class Request
{
public:Request() {}Request(int x, int y, char op) : _x(x), _y(y), _op(op) {}//序列化bool serialize(string &out){Json::Value root;root["left"] = _x;root["right"] = _y;root["op"] = _op;Json::FastWriter writer;out = writer.write(root);        return true;}//反序列化bool deserialize(const string &in){Json::Value root;Json::Reader reader;reader.parse(in, root);_x = root["left"].asInt();_y = root["right"].asInt();_op = root["op"].asInt();return true;}
public:int _x;int _y;char _op;
};
class Response
{
public:Response() {}Response(int exitcode, int result) : _exitcode(exitcode), _result(result) {}//序列化bool serialize(string &out){Json::Value root;root["exitcode"] = _exitcode;root["result"] = _result;Json::FastWriter writer;out = writer.write(root);return true;}//反序列化bool deserialize(const string &in){Json::Value root;Json::Reader reader;reader.parse(in, root);_exitcode = root["exitcode"].asInt();_result = root["result"].asInt();return true;}public:int _exitcode;int _result;
};

相关文章:

【Linux】自定协议和序列化与反序列化

目录 一、序列化与反序列化概念 二、自定协议实现一个加法网络计算器 &#xff08;一&#xff09;TCP如何保证接收方的接收到数据是完整性呢&#xff1f; &#xff08;二&#xff09;自定义协议 &#xff08;三&#xff09;自定义协议的实现 1、基础类 2、序列化与反序列…...

混合专家模型(MoE):高效处理复杂任务的智能架构,DeepSeek性能出色的秘诀

混合专家模型 1. 什么是混合专家模型 混合专家模型&#xff08;Mixture of Experts&#xff0c;简称 MoE&#xff09; 是一种先进的神经网络架构&#xff0c;旨在通过整合多个 专门化的子模型&#xff08;或称为“专家”&#xff09; 的预测来提升整体模型性能。其核心思想是…...

使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控

使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控系统&#xff0c;可以分为以下几个步骤&#xff1a; 1. 系统架构设计 前端&#xff1a;使用 Vue.js、React 或 Angular 等前端框架实现用户界面。后端&#xff1a;使用 Spring Boot 提供 RESTful API&#xff0c;负责与…...

C++ 内存序在多线程中的使用

目录 一、内存顺序 二、 指令重排在多线程中的问题 2.1 问题与原因 2.2 解决方案 三、六种内存序 3.1 memory_order_relaxed 3.2 memory_order_consume 3.3 memory_order_acquire 3.4 memory_order_release 3.5 memory_order_acq_rel 3.6 memory_order_seq_cst 一、…...

【MySQL】表的操作

文章目录 &#x1f449;表的操作&#x1f448;创建表查看表修改表删除表 &#x1f449;表的操作&#x1f448; 创建表 create tabletable_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a;…...

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计

【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计 1. **欺诈场景分类与案例说明**1.1 **大额交易欺诈**1.2 **异地交易欺诈**1.3 **高频交易欺诈**1.4 **异常时间交易欺诈**1.5 **账户行为异常**1.6 **设备指纹异常**1.7 **交易金额突变** 2. **普适性软…...

DeepSeek-R1本机部署(VLLM+OpenWebUI)

本文搭建环境 系统&#xff1a;Ubuntu 22.04.4 LTS Python版本&#xff1a;Python 3.10 显卡&#xff1a;RTX 4090D 一、DeepSeek-R1-14b原始模型和q8量化模型 1.从modelscope下载模型 官方原始模型&#xff1a;https://modelscope.cn/models/deepseek-ai/DeepSeek-R1-Di…...

计算机网络软考

1.物理层 1.两个主机之间发送数据的过程 自上而下的封装数据&#xff0c;自下而上的解封装数据&#xff0c;实现数据的传输 2.数据、信号、码元 码元就是数字通信里用来表示信息的基本信号单元。比如在二进制中&#xff0c;用高电平代表 “1”、低电平代表 “0”&#xff0c…...

vscode 查看3d

目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件&#xff1a; 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程&#xff1a;开始是绿屏&#xff0c;过了1到2秒&#xff0c;后来就正常看了。 2. vsc…...

HTML第三节

一.初识CSS 1.CSS定义 A.内部样式表 B.外部样式表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…...

爬虫去重:数据采集时如何进行去重,及去重优化策略

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 去重的核心思路2. 常见的去重方法2.1 基于集合(Set)的去重2.2 基于布隆过滤器(Bloom Filter)的去重2.3 基于数据库的去重2.4 基于文件存储的去重2.5 基于 Redis 的去重3. 去重的优化策略3.1 URL 规范化3.2 分片去…...

IDEA集成DeepSeek,通过离线安装解决无法安装Proxy AI插件问题

文章目录 引言一、安装Proxy AI1.1 在线安装Proxy AI1.2 离线安装Proxy AI 二、Proxy AI中配置DeepSeek2.1 配置本地部署的DeepSeek&#xff08;Ollama方式&#xff09;2.2 通过第三方服务商提供的API进行配置 三、效果测试 引言 许多开发者尝试通过安装Proxy AI等插件将AI能力…...

【电子基础】运算放大器应用笔记(持续更新)

目录 运放应用1&#xff1a; 运放基础知识同相比例运算放大器计算放大倍数 电压比较器 运放应用2&#xff1a;500W调压器同相比例运算放大器计算放大倍数计算平衡电阻 积分电路 运放应用3&#xff1a;逆变电焊机电压跟随器积分电路 加油站1. 为什么比例运算放大电路要加平衡电阻…...

计算机网络核心知识点:信道容量、OSI模型与调制技术详解

目录 一、信道容量与调制技术 奈奎斯特定理&#xff08;无噪声环境&#xff09; 核心公式&#xff1a; 参数说明&#xff1a; 应用场景&#xff1a; 香农定理&#xff08;有噪声环境&#xff09; 核心公式&#xff1a; 参数说明&#xff1a; 应用场景&#xff1a; 奈奎…...

AI赋能企业协作4-NL2Sql技术路线

1.1 对话即服务的一点思考 在数智化转型的过程中&#xff0c;基于即时通信&#xff08;IM&#xff09;的协作平台正悄然成为企业智能化转型的“新基建”。协作平台天然具备高频交互、实时协同和场景化落地的特性&#xff0c;仿佛是为对话式AI量身定制的试验场——员工在熟悉的聊…...

如何用FFmpeg高效拉流(避坑指南)

FFmpeg作为音视频处理领域的“瑞士军刀”,其拉流功能在直播、监控、流媒体分析等场景中应用广泛。本文从实战角度出发,系统梳理FFmpeg拉流的核心工具链、协议适配技巧及高频踩坑点,助你快速掌握流媒体处理核心技能! 一、FFmpeg拉流工具链全解析 核心工具 ffplay:快速验证…...

面试基础--MySQL SQL 优化深度解析

MySQL SQL 优化深度解析&#xff1a;EXPLAIN、索引优化与分库分表实践 引言 在互联网大厂的高并发场景下&#xff0c;数据库的性能优化是至关重要的。MySQL 作为最流行的关系型数据库之一&#xff0c;SQL 查询的性能直接影响了系统的响应时间和吞吐量。本文将深入探讨 MySQL …...

WebRTC简介

WebRTC简介 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种支持浏览器之间进行实时音视频通信和数据传输的开放标准和技术。它由Google发起&#xff0c;现已成为W3C和IETF的标准。WebRTC允许开发者在不依赖第三方插件或软件的情况下&#xff0c;直接在网页…...

清北deepseek8本手册

“清北手册”通常是“清华大学和北京大学推出的DeepSeek手册”的简写。近期&#xff0c;随着AI技术的迅速发展&#xff0c;清北两高校陆续发布多本自家的DeepSeek学习手册&#xff0c;助力普通人学习进阶。 清华大学的DeepSeek手册已推出5册&#xff0c;内容丰富全面&#xff0…...

前后分离文件上传案例,前端HTML,后端Net6开发的webapi(完整源代码)下载

文件上传功能在项目开发中非常实用&#xff0c;本案例前端用HTML页面的form表单实现&#xff0c;后端用Net6实现。 前后分离文件上传案例&#xff0c;前端HTML&#xff0c;后端Net6&#xff08;完整源代码&#xff09; 下载链接https://download.csdn.net/download/luckyext/9…...

6.过拟合处理:确保模型泛化能力的实践指南——大模型开发深度学习理论基础

在深度学习开发中&#xff0c;过拟合是一个常见且具有挑战性的问题。当模型在训练集上表现优秀&#xff0c;但在测试集或新数据上性能大幅下降时&#xff0c;就说明模型“记住”了训练数据中的噪声而非学习到泛化规律。本文将从实际开发角度系统讲解如何应对过拟合&#xff0c;…...

六十天前端强化训练之第一天到第七天——综合案例:响应式个人博客项目

欢迎来到编程星辰海的博客讲解 目录 前言回顾 HTML5与CSS3基础 一、知识讲解 1. 项目架构设计&#xff08;语义化HTML&#xff09; 2. 响应式布局系统&#xff08;Flex Grid&#xff09; 3. 样式优先级与组件化设计 4. 完整响应式工作流 二、核心代码示例 完整HTML结…...

java数据结构_再谈String_10

目录 字符串常量池 1. 创建对象的思考 2. 字符串常量池&#xff08;StringTable&#xff09; 3. 再谈String对象创建 字符串常量池 1. 创建对象的思考 下面两种创建String对象的方式相同吗&#xff1f; public static void main(String[] args) {String s1 "hello&…...

MCP:重塑AI与数据交互的新标准

MCP&#xff1a;重塑AI与数据交互的新标准 前言 在人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;的应用日益广泛&#xff0c;但其与外部数据源和工具的集成却一直面临复杂性和碎片化的挑战。 Anthropic提出的MCP&#xff08;Model Context Protocol&…...

Cursor+Claude3.7实现从原型到app开发

最近在X上看到了一些人在用Claude 3.7 Sonnet生成 app原型图的尝试&#xff0c;受到启发&#xff0c;发现这么先生成不同界面的原型图再让Cursor基于原型图开发app会是很好的尝试。尤其是&#xff0c;你也可以不两步直接生成&#xff0c;而是在过程中更可视化地思考你要生产的原…...

洛谷P1334

题目如下 思路&#xff1a; 每次选择最短的两块木板进行合并&#xff0c;直到只剩下一块木板。使用最小堆&#xff08;优先队列&#xff09;来实现这一过程。使用最小堆&#xff1a; 将所有木板的长度放入最小堆&#xff08;优先队列&#xff09; 每次从堆中取出两块最短的木…...

使用wifi连接手机adb进行调试|不使用数据线adb调试手机|找应用错误日志和操作日志

手机在开发者选项里要开启无线调试 在手机设置中查看WiFi的IP地址 设置 -> WLAN -> 已连接的WiFi -> IP地址 使用手机的IP地址连接 adb connect 192.168.1.12:xxxxx 检查连接状态 adb devices 断开特定设备 adb disconnect 192.168.x.x:xxxxx 断开所有设备 …...

大语言模型中温度参数(Temperature)的核心原理

大语言模型中温度参数&#xff08;Temperature&#xff09;的核心原理是通过调整模型输出的概率分布&#xff0c;控制生成结果的随机性和多样性。以下是其原理的详细说明&#xff1a; 一、定义与核心作用 温度参数是生成式模型&#xff08;如GPT系列&#xff09;中的一个超参数…...

【AIGC】通义万相 2.1 与蓝耘智算:共绘 AIGC 未来绚丽蓝图

一、引言 在人工智能技术迅猛发展的今天&#xff0c;AIGC&#xff08;生成式人工智能内容生成&#xff09;领域正以惊人的速度改变着我们的生活和工作方式。从艺术创作到影视制作&#xff0c;从广告设计到智能客服&#xff0c;AIGC 技术的应用越来越广泛。通义万相 2.1 作为一…...

在Ubuntu上搭建Samba服务,实现与windows之间的文件共享

1.安装samba 首先切换为root账户&#xff0c;就是带#符号的表示当前登录的是root超级用户&#xff1b; su - 如果忘记密码&#xff0c;就输入以下命令修改密码 sudo passwd root 再切换为超级用户 然后进行更新软件列表 sudo apt update sudo apt install samba安装 whe…...

Labview培训案例3: 输出正弦波并采集显示

本案例介绍如何从板卡&#xff08;USB6008&#xff09;的模拟量输出端口输出一个正弦波&#xff0c;然后模拟量输入模块进行采样&#xff0c;然后显示到vi画面的‘波形图’中。 详细代码在&#xff1a;Labview课程3&#xff1a;正弦波输出&采集数据&显示资源-CSDN文库 …...

使用 Deepseek + kimi 快速生成PPT

前言 最近看到好多文章和视频都在说&#xff0c;使用 Deepseek 和 kimi 能快速生成精美的 ppt&#xff0c;毕竟那都是别人说的&#xff0c;只有自己尝试一次才知道结果。 具体操作 第一步&#xff1a;访问 deepseek 我们访问 deepseek &#xff0c;把我们想要输入的内容告诉…...

图解MOE大模型的7个核心问题并探讨DeepSeekMoE的专家机制创新

原文地址:https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-mixture-of-experts #mermaid-svg-FU7YUSIfuXO6EVHa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FU7YUSIfuXO6EVHa .error-icon{fill…...

青训营:简易分布式爬虫

一、项目介绍 该项目是一个简易分布式爬虫系统&#xff0c;以分布式思想为基础&#xff0c;通过多节点协作的方式&#xff0c;将大规模的网页抓取任务分解&#xff0c;从而高效、快速地获取网络数据 。 项目地址&#xff1a;https://github.com/yanchengsi/distributed_crawle…...

Scala(Array,List,Set,Map,Tuple,字符串 使用的简单介绍)

目录 Array 不可变数组 ArrayBuffer可变数组 List 不可变列表 ListBuffer 可变列表 Set 集合&#xff08;可变不可变&#xff09; Map映射(可变不可变)(键值对) Tuple 元组 字符串 Array 不可变数组 // Array 数组// scala 中的数组下标是()// scala 中的数组是值…...

fmql之Linux WDT

正点原子第52章。 基础知识 正点原子教程 fmql-dts 代码 APP代码&#xff08;不需要编写驱动代码&#xff09; static int dw_wdt_drv_probe(struct platform_device *pdev) {struct device *dev &pdev->dev;struct watchdog_device *wdd;struct dw_wdt *dw_wdt; …...

IntelliJ IDEA集成MarsCode AI

IntelliJ IDEA集成MarsCode AI IDEA中安装插件 安装完毕之后登录自己的账号 点击链接&#xff0c;注册账号 https://www.marscode.cn/events/s/i5DRGqqo/ 可以选择不同的模型...

python-leetcode-打家劫舍 III

337. 打家劫舍 III - 力扣(LeetCode) 这个问题可以通过动态规划解决。可以通过递归的方式来解决每个房子的最大偷窃金额,递归过程中,我们会记录每个房子是否偷或不偷时能够获得的最大金额。 思路: 对于每个房子,我们有两种选择: 偷这个房子,那么它的直接相邻(父亲和孩…...

数据结构——队列

1. 概念与结构 队列&#xff08;Queue&#xff09;是一种先进先出&#xff08;FIFO, First In First Out&#xff09;的数据结构&#xff0c;即最先被插入队列的数据会最先被删除。队列广泛应用于计算机科学中&#xff0c;特别是在任务调度、缓冲区管理、网络数据传输等领域。…...

GaussianCity:实时生成城市级数字孪生基底的技术突破

在空间智能领域,如何高效、大规模地生成高质量的3D城市模型一直是一个重大挑战。传统方法如NeRF和3D高斯溅射技术(3D-GS)在效率和规模上存在显著瓶颈。GaussianCity通过创新性的技术方案,成功突破了这些限制,为城市级数字孪生的构建提供了全新路径。 一、核心创新:突破传…...

【AGI】智谱开源2025:一场AI技术民主化的革命正在到来

智谱开源2025&#xff1a;一场AI技术民主化的革命正在到来 引言&#xff1a;开源&#xff0c;一场技术平权的革命一、CogView4&#xff1a;中文AI生成的里程碑1. 破解汉字生成的“AI魔咒”2. 开源协议与生态赋能 二、AutoGLM&#xff1a;人机交互的范式跃迁1. 自然语言驱动的跨…...

【算法学习之路】5.贪心算法

贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳&#xff01;3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也写了几篇&#xff0c;题单正在更新&#xf…...

C++11中的右值引用和完美转发

C11中的右值引用和完美转发 右值引用 右值引用是 C11 引入的一种新的引用类型&#xff0c;用 && 表示。它主要用于区分左值和右值&#xff0c;并且可以实现移动语义&#xff0c;避免不必要的深拷贝&#xff0c;提高程序的性能。左值通常是可以取地址的表达式&#xf…...

Leetcode 1477. 找两个和为目标值且不重叠的子数组 前缀和+DP

原题链接&#xff1a; Leetcode 1477. 找两个和为目标值且不重叠的子数组 class Solution { public:int minSumOfLengths(vector<int>& arr, int target) {int narr.size();int sum0;int maxnINT_MAX;vector<int> dp(n,maxn);//dp[i]表示以索引i之前的满足要求…...

koa-session设置Cookie后获取不到

在谷歌浏览器中请求获取不到cookie问题之一&#xff08;谷歌安全策略&#xff09; 场景 前端使用 axios 请求&#xff0c;项目地址&#xff1a;http://192.168.8.1:5173 import axios from axiosconst request axios.create({baseURL: http://127.0.0.1:3001/,timeout: 60000,…...

Linux三种网络方式

前言 发现运维啥都得会&#xff0c;这周就遇到了网络问题自己无法解决&#xff0c;因此痛定思痛学一下。 参考文献 你管这破玩意叫网络&#xff1f; 桥接模式、NAT模式、仅主机模式&#xff0c;原来是这样工作的 交换机 构成局域网&#xff0c;实现所有设备之间的通信。 …...

android_viewtracker 原理

一、说明 我们业务中大部分场景是用 RecyclerView 实现的列表&#xff0c;而 View 的曝光通常是直接写在 adapter 的 onBindViewHolder 中&#xff0c;这样就会导致 item 还没显示出来的时候就会触发曝光。最近业务提出需要实现根据 View 显示在屏幕上面积大于 80% 才算曝光。…...

Object.defineProperty()

**Object.defineProperty()** 方法会直接在一个对象上定义一个新属性&#xff0c;或者修改一个对象的现有属性&#xff0c;并返回此对象。 plain const object1 {}; Object.defineProperty(object1, ‘property1’, { value: 42, writable: false }); object1.property1 77…...

大模型+知识图谱:重塑企业制度标准管理

在数字化转型的浪潮中&#xff0c;制度标准管理领域正迎来一场革命性的变革。借助大模型和知识图谱等前沿人工智能技术&#xff0c;制度标准管理不再仅仅是简单的文档存储和检索&#xff0c;而是演变为一个智能化、高效化、精准化的管理体系。 1.关键技术 我们的制度标准管理…...

ubuntu20系统下conda虚拟环境下安装文件存储位置

在 Conda 虚拟环境中执行 pip install 安装软件后&#xff0c;安装的文件会存储在该虚拟环境专属的 site-packages 目录中。具体路径取决于你激活的 Conda 环境路径。以下是定位步骤&#xff1a; 1. 确认 Conda 虚拟环境的安装路径 查看所有环境&#xff1a; conda info --env…...