自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 c++命名规范,.cpp.,.h,类成员,全局变量,结构体变量名称,函数名称,命名规范的依据,怎么规范命名

在C++编程中,良好的命名规范对于代码的可读性和可维护性至关重要。这些规范和示例展示了如何在C++项目中使用统一的命名风格来提高代码的可读性和维护性。// 类名使用 PascalCase。// 文件名:myclass.cpp。// 私有成员变量使用下划线开头。// 函数实现遵循命名规范。

2024-07-18 10:45:37 287

原创 RSA签名和验签

在C++中,可以使用OpenSSL库来实现RSA的签名和验签功能。通过以上步骤,你可以开始从头实现RSA的签名和验签功能。这需要一定的数学和编程技能,但是理解了RSA的数学原理和正确实现后,你就可以不依赖外部库完整实现RSA功能。大数运算的精度:确保实现的大数运算库支持足够大的数值,以适应RSA算法的需求。调试和测试:由于RSA算法涉及复杂的数学运算,调试和测试是非常重要的步骤。安全性考量:RSA算法的安全性依赖于生成安全的大素数和正确实现算法。

2024-07-15 18:05:53 156

原创 S5730交换机上配置访问控制列表(ACL)、OSPF路由和PIM-SM组播

display traffic-filter interface GigabitEthernet0/0/1 inbound # 显示接口应用的ACL信息。display pim sm interface GigabitEthernet0/0/1 # 显示接口PIM-SM状态。display pim sm group # 显示当前的组播组信息。display ospf peer # 显示OSPF邻居状态。display ospf route # 显示OSPF路由表。配置PIM-SM以支持组播通信。

2024-07-12 09:56:06 358

原创 S5730 OSPF: 配置 OSPF 进程和区域

Sysname-GigabitEthernet0/0/1] ospf 1 area 0 // 将接口分配到 OSPF 进程 1 的区域 0。[Sysname-GigabitEthernet0/0/1] ospf enable 1 // 启用 OSPF 进程 1 在该接口上。[Sysname-ospf-1] router-id 1.1.1.1 // 指定 OSPF 路由器 ID。[Sysname] interface GigabitEthernet0/0/1 // 进入接口配置模式。

2024-07-12 09:26:32 129

原创 通俗易懂地解释OSI 模型中的几层以及它们各自的作用

通常,每一层的协议都建立在下一层的服务之上,形成了分层的网络通信结构,提供了灵活性和互操作性。作用:物理层是网络通信的最底层,负责在物理媒介上传输数据比特流(0 和 1),主要关注的是如何在传输介质上进行数据的传输和接收,例如电缆、光纤、无线电等。举例:传输层最常见的协议是 TCP(Transmission Control Protocol,传输控制协议),它提供可靠的、面向连接的数据传输服务。作用:网络层负责通过定义的路由算法和协议来管理数据包在网络中的传输路径,实现不同网络之间的互联互通。

2024-07-11 12:10:49 167

原创 tcp 中的poll机制介绍

虽然上面的示例是基于单线程的 accept 和 read,它只能处理一个连接,直到它结束才能处理下一个连接。通过 accept 接受新的连接,并将新连接的 client_socket 添加到 fds 中,以便后续 poll 能够监视它。处理客户端消息:对于已连接的 client_socket,当有 POLLIN 事件发生时,读取客户端发送的数据并进行处理。这样可以实现并发处理多个客户端连接。事件驱动:这些机制使得程序能够以事件驱动的方式运行,即在有事件发生时才进行相应的处理,而不是轮询或阻塞等待。

2024-07-07 09:23:26 862

原创 c与c++ 常用的字符与字符串处理的接口介绍:

字符拷贝:char* strncpy(char* dest, const char* src, size_t n) 将源字符串的前 n 个字符拷贝到目标字符串。字符比较:int strncmp(const char* str1, const char* str2, size_t n) 比较两个字符串的前 n 个字符。字符串连接:strcat(char* dest, const char* src) 将源字符串连接到目标字符串的末尾。字符串长度:size() 返回字符串的长度。

2024-07-06 12:19:39 278

原创 c与c++ 常用的字符与字符串处理的接口介绍:

字符拷贝:char* strncpy(char* dest, const char* src, size_t n) 将源字符串的前 n 个字符拷贝到目标字符串。字符比较:int strncmp(const char* str1, const char* str2, size_t n) 比较两个字符串的前 n 个字符。字符串连接:strcat(char* dest, const char* src) 将源字符串连接到目标字符串的末尾。字符串长度:size() 返回字符串的长度。

2024-07-06 12:04:56 700

原创 c++友元函数,友元类这有啥用呢,如何使用友元函数和友元类。

c++友元函数,友元类这有啥用呢在 C++ 中,友元函数和友元类的概念允许非成员函数或者外部类访问一个类的私有成员或保护成员。这种机制虽然破坏了面向对象编程的封装性原则,但在某些特定情况下是有用的,主要体现在以下几个方面:友元函数的用处:增强类的灵活性和功能:友元函数可以访问类的私有成员或保护成员,从而扩展了类的功能性。例如,某些操作可能不适合作为类的成员函数,但又需要访问类的私有成员,这时可以设计为友元函数。提高效率:友元函数可以直接访问类的成员,避免了通过公有接口进行间接访问,从而提高了效率

2024-07-05 09:08:44 293

原创 Linux 下c++ 的ssh服务端验证代码示例

主循环:使用 ssh_bind_accept 接受客户端连接,并使用 ssh_handle_key_exchange 完成密钥交换。以下是一个简单的示例,展示了如何建立一个基本的SSH服务端,并进行用户名和密码的验证。依赖库和头文件:使用了 libssh/libssh.h 和 libssh/server.h 提供的API,这些函数用于创建SSH服务器和处理连接。通过这个示例,你可以基于libssh库编写一个简单的SSH服务端程序,并进行基本的用户名密码验证。// 用户名和密码的验证函数。

2024-07-04 11:31:41 280

原创 通过JSON文件存储和实现通过MAC地址或其他项来查询相关信息

在 main 函数中,首先调用 readMacInfoFromJson 读取JSON文件中的数据,并展示了如何使用 queryByMac 函数来查询特定MAC地址的信息。readMacInfoFromJson 函数负责从JSON文件中读取数据,并将每个MAC地址的信息存储在 MacInfo 结构体中。通过这种方法,你可以灵活地根据不同的标识符来查询和管理MAC地址的相关信息,同时利用JSON文件进行数据的持久化存储和读取。使用C++读取和解析JSON文件,并实现根据MAC地址或其他项来查询信息的功能。

2024-07-02 14:12:14 317

原创 用c++封装一个获取这个时间的接口

在 main() 函数中,我们展示了如何使用 TimeUtils::getCurrentUnixTimestamp() 方法来获取当前时间的 Unix 时间戳,并将结果打印出来。在 C++ 中封装一个获取当前时间的 Unix 时间戳的接口,我们可以创建一个简单的类或者函数来实现。now.time_since_epoch() 返回自 Unix 时间点(1970年1月1日00:00:00 UTC)以来的时间间隔。std::chrono::system_clock::now() 获取当前时间点。

2024-07-01 08:51:59 286

原创 tcp/ip通信的c++验证代码

当涉及到基本的TCP/IP通信验证代码时,可以创建一个简单的服务器和客户端来进行通信。下面分别展示一个简单的C++ TCP/IP服务器和客户端的示例代码。这是一个简单的TCP/IP服务器,它监听指定端口并接收来自客户端的连接。这是一个简单的TCP/IP客户端,它连接到指定的服务器和端口,并发送一条消息。使用 listen() 开始监听连接请求,并使用 accept() 接受来自客户端的连接。使用 send() 发送消息给服务器,并使用 read() 读取来自服务器的响应。TCP/IP 服务器示例代码。

2024-06-28 09:11:54 398

原创 开发问题记录

步骤2:打开/root/.bashrc最后一行添加:export PATH=“$PATH:/root/Desktop/arm-linux-eabi/bin”我这样用对吗,我怕username这个是个局部变量,把地址给了par,这个结构体中也是存的局部变量username的地址,那外部函数要。我这样用对吗,我怕username这个是个局部变量,把地址给了par,这个结构体中也是存的局部变量username的地址,那外部函数要。// 这个用法会段错误吗,因为这个地址早就随局部变量释放了,有什么科学的用法吗。

2024-06-25 09:33:48 500

原创 linux 下启动app

创建启动脚本:创建一个启动脚本,命名为你的应用程序或服务的名称。这个脚本负责启动、停止和管理你的应用程序。你可以使用 sudo 权限和任何文本编辑器创建这个脚本,比如 nano:bash在编辑器中输入启动脚本的内容。一个简单的例子可能如下所示:bash/bin/bash。

2024-06-25 09:01:33 848

原创 c++ 常用的锁及用法介绍和示例

在 C++ 中,常用的锁主要包括以下几种:std::mutex、std::recursive_mutex、std::timed_mutex 和 std::shared_mutex。另一个重要的区别是,std::unique_lock 在等待条件变量(std::condition_variable)时比 std::lock_guard 更有优势,因为它可以在等待期间解锁互斥量,从而允许其他线程访问共享资源,而 std::lock_guard 则不行。这意味着它适合于那些需要在有限作用域内锁住互斥量的场景。

2024-06-21 14:34:02 980

原创 c++中串口的安全封装使用

对于内置类型,如果不显式初始化,它们的值是未定义的,可能包含任何内容。在你的代码中,buffer是一个字符数组,不需要显式初始化,因为你马上就会用::read函数把数据填充进去。字符串构造:如果::read返回负值,那么std::string(buffer, bytes_read)中的bytes_read将是负值,这会导致未定义行为。你需要确保bytes_read是非负的。在上述代码中,我添加了对read函数返回值的检查,以确保没有发生错误。如果::read返回负值,我们将抛出一个异常,以指示读取失败。

2024-06-21 11:29:10 360

原创 Lambda 表达式是为了解决啥问题,语法,使用规则,c++中的常用用法示例

捕获方式可以是按值捕获([=])或按引用捕获([&]),也可以指定具体的变量进行捕获([x, &y])。传统的函数对象需要定义一个具名的类或者使用函数指针,而Lambda 表达式可以在需要时直接定义一个匿名函数,从而减少代码量和提高代码的可读性。捕获外部变量:Lambda 表达式可以在定义时捕获外部作用域的变量,捕获方式包括按值、按引用或混合捕获。函数体:Lambda 表达式的函数体可以包含多条语句,可以访问捕获的变量和参数。函数体:Lambda 表达式的实际代码部分,与普通函数体的语法相同。

2024-06-21 11:26:20 300

原创 在 Ubuntu 下使用 rabbitmq-c 库进行 RabbitMQ 消息收发的完整示例代码如下

消费者标签 (consumer_tag): 如果你希望手动设置消费者标签,可以传入一个非空的 amqp_bytes_t 对象作为 consumer_tag 参数。要订阅的队列名称,使用 amqp_cstring_bytes(QUEUE_NAME) 将队列名转换为 amqp_bytes_t 类型。一般可以传入 amqp_empty_bytes 表示不需要特定的消费者标签,由服务器自动生成。envelope.message.body.len 表示消息体的长度,通常是一个整数值,表示消息体的字节数。

2024-06-19 21:02:28 576

原创 Linux 开发笔记

你可以使用以下命令来查看当前文件夹下各目录的大小:如果你想查看 /var/log 目录下各子目录的大小,可以执行以下命令:

2024-06-19 17:11:41 104

原创 用c++封装个接口,调试的时候传入颜色即可,使用便捷

例如,要打印红色文本,可以调用 ColorPrinter::print(“这是红色文本示例”, ColorPrinter::ANSI_COLOR_RED);ColorPrinter::print(“这是紫色文本示例”, ColorPrinter::ANSI_COLOR_MAGENTA);ColorPrinter::print(“这是红色文本示例”, ColorPrinter::ANSI_COLOR_RED);调用了 ColorPrinter::print 方法来输出不同颜色的文本。

2024-06-18 11:47:11 387

原创 调试的时候给打印加颜色

在大多数操作系统中,控制台颜色是通过特殊的转义序列来实现的。使用库:如果需要更复杂的控制台输出格式,可以考虑使用第三方库,例如 Boost 库的 boost::format 或者 C++17 中引入的 std::format。std::cout

2024-06-18 11:39:00 386

原创 嵌入式软件开发技术能力有哪些阶段,各个阶段是达到什么水平

初级阶段注重基础的夯实,中级阶段强调实际项目经验和技能提升,高级阶段需要整体系统的设计和优化能力,而专家阶段则要求在特定领域内的深度知识和创新能力。通信协议:熟悉常见的通信协议(如CAN、Ethernet、USB、BLE等),并能够实现和调试协议栈。单片机开发:能够进行简单的单片机(如8051、AVR、PIC等)开发,编写基本的GPIO操作代码。外设接口:熟悉常用的外设接口(如I2C、SPI、UART、ADC、PWM等)的配置和使用。持续创新:不断研究和应用最新的技术和工具,推动产品和技术的发展。

2024-06-15 14:25:53 392

原创 一个简单的UDP客户端和服务端的完整C++示例

下面是一个简单的UDP客户端和服务端的完整C++示例。这个示例展示了如何创建一个UDP客户端和服务端,并在它们之间发送和接收消息。如果一切正常,服务端会收到来自客户端的消息并回复,客户端则会显示服务端的回复消息。这段代码示范了最基本的UDP通信,在实际应用中可能需要更复杂的错误处理和数据管理。权限问题:某些端口(如小于1024的端口)需要有管理员权限才能绑定。网络设置:确保防火墙或其他网络设置允许UDP流量通过所选的端口。端口冲突:确保端口号(这里是8080)没有被其他应用程序占用。

2024-06-15 14:00:27 472

原创 简单的线程池示例

r\n:‘\r’ 是回车符,将光标移到当前行的起始位置;‘\n’ 是换行符,将光标移到下一行。因此,“\r\n” 可以确保新的一行从行首开始显示。handler这个全局的类变量在其他类线程中使用,在每个线程中上锁,锁可以用std::mutex Mutex;这是因为 ‘\r’ (回车) 将光标移动到当前行的开头,而 ‘\n’ (换行) 将光标移动到下一行。// 替换为实际的串口设备名称。你可以在每行数据后添加 ‘\r\n’ 而不是只添加 ‘\n’。// 在循环内部处理 respond 的逻辑。

2024-06-15 10:13:34 492

原创 串口操作的问题

r\n:‘\r’ 是回车符,将光标移到当前行的起始位置;‘\n’ 是换行符,将光标移到下一行。因此,“\r\n” 可以确保新的一行从行首开始显示。handler这个全局的类变量在其他类线程中使用,在每个线程中上锁,锁可以用std::mutex Mutex;这是因为 ‘\r’ (回车) 将光标移动到当前行的开头,而 ‘\n’ (换行) 将光标移动到下一行。// 替换为实际的串口设备名称。你可以在每行数据后添加 ‘\r\n’ 而不是只添加 ‘\n’。// 在循环内部处理 respond 的逻辑。

2024-06-13 14:49:20 171

原创 如何使用单例模式来实现消息处理类,并确保多线程安全性

在上面的代码中,我将消息处理类设计为单例模式,并通过 getInstance() 方法获取其唯一实例。在一个大型项目中,确保消息处理的线程安全性是非常重要的。使用单例模式来管理消息处理类是一个合理的选择,因为它可以确保在整个应用程序中只有一个消息处理类的实例,从而简化了消息的管理和确保线程安全性。// 私有构造函数,防止外部实例化。// 获取消息处理类的单例实例。// 创建多个线程执行示例函数。// 消息处理类(单例)

2024-06-07 11:12:34 304

原创 rabbitmq-c库下载,编译,验证,移植

/Configure linux-aarch64 --prefix=/opt/rabbitmq/install //其中 /opt/rabbitmq/install是您希望将 OpenSSL 安装到的目录路径。在板子上运行传输过去的可执行文件,确保 RabbitMQ 服务器的 IP 地址和端口号正确,并且板子能够连接到 RabbitMQ 服务器。这将安装编译好的库到系统中,还有一些需要的头也会放入系统路径,您可能需要 root 权限来执行此步骤。这将执行 CMake 构建系统来配置您的项目。

2024-06-04 16:33:06 375 3

原创 下载 MySQL 到使用 MySQL 的过程:

对于 C++ 中如何使用 MySQL,你可以使用 MySQL 提供的 C API 或者 C++ 封装库(例如 MySQL Connector/C++)来与 MySQL 进行交互。访问 MySQL 官方网站(https://dev.mysql.com/downloads/mysql/)并下载适用于你操作系统的 MySQL Community Server。可以选择使用 MySQL 官方提供的 MySQL Shell 或者 MySQL Workbench 作为客户端工具,用于连接和管理 MySQL 服务器。

2024-06-04 14:04:56 200

原创 nlohmann/json.hpp库的使用:

它是一个 C++ 的 JSON 解析和生成库,旨在简化处理 JSON 数据的过程。如果您需要在其他语言中处理 JSON 数据,通常会选择该语言的专门用于 JSON 处理的库或模块。nlohmann/json.hpp 是一个单一的头文件,可以被大多数 C++11 兼容的编译器所支持,包括 GCC、Clang 和 Visual C++ 等。解析和生成 JSON 数据: nlohmann/json.hpp 库提供了简单易用的接口,可以轻松地解析 JSON 数据并生成对应的 JSON 结构。

2024-05-31 13:40:30 286

原创 linux开发板改时间,复制文件

永久保存:考文件:在开发板执行:开发板自启动:

2024-05-29 11:46:13 87

原创 正则匹配出 类型 Basic,名称:2001,规则类型: permit, ip:192.168.1.0,掩码:0.0.0.255,用nlohmann/json.hpp库 json输出

【代码】正则匹配出 类型 Basic,名称:2001,规则类型: permit, ip:192.168.1.0,掩码:0.0.0.255,用nlohmann/json.hpp库 json输出。

2024-05-27 17:41:07 221

原创 rabiitmq-c库,openssl交叉编译及错误解决

/Configure linux-aarch64 --prefix=/opt/rabbitmq/install //其中 /opt/rabbitmq/install是您希望将 OpenSSL 安装到的目录路径。2024-5-15调试了一早上,虚拟机22.04一直报这个错,解决不掉。把系统路径下的考到本地。

2024-05-15 15:34:24 398

原创 c++正则表达式

示例:(\d{3})-(\d{3})-(\d{4}) 可以匹配并捕获美国电话号码格式,如 “555-123-4567” 中的区号、前缀和行号。[^abc]: [^abc] 匹配除了 “a”、“b” 和 “c” 之外的任意字符。[abc]: [abc] 匹配 “a”、“b” 或 “c” 中的任意一个字符。\w: \w+ 可以匹配 “hello123” 中的字母和数字部分。[0-9]: [0-9]{2} 可以匹配 “12” 中的数字。\d: \d{3} 可以匹配 “123” 中的数字部分。

2024-05-08 20:58:05 278

原创 编 程 笔 记

gdb 调试段错误:注意:源代码编译的时候要加-g选项生成调试信息启动程序和调试会话:gdb :启动 GDB 并加载可执行文件。gdb --args :启动 GDB 并将参数传递给可执行文件。修改程序状态:set = :修改变量的值。return :在当前函数中返回指定的表达式结果。

2024-02-06 14:22:06 898 1

原创 Makefile 使用

(SRC),$(file:.c=.o)) variable 是一个变量名,list 是要迭代的列表,text 则是要执行的操作或命令。在 Linux 中,以点开头的文件和文件夹都被认为是隐藏文件或文件夹,它们不会在默认情况下显示在文件浏览器或终端中。gcc -c -o c.o c.c -MD -MF c.d //编译c.o,把依赖写入c.d。2,依赖项时间比前面新,本质是和前面文件比对时间戳,更新就执行,否则不执行。gcc -M -MF c.d c.c //把依赖写入文件c.d。

2024-02-01 19:41:37 412 1

原创 【无标题/* 汇编指令 */

Branch and Link,先把返回地址保存在LR寄存器再跳转。读地址“r1+4”,得到的4个字节存入 R0。把R0的4个字节写如地址“R1+4”CMP R0, R1;结果保存在PSR(程序状态寄存器)Branch ,直接跳转。.写内存:stroe。

2024-02-01 19:37:54 357 1

原创 静态库.a 与动态库.so 的生成和用法

1,生成共享库. -shared 选项告诉编译器生成共享库,-o libsum.so 指定生成的库文件名,-fPIC 选项用于生成位置无关的代码,这对于共享库是必需的。5,注意:动态库不是链接到可执行文件中的,所以系统会在公共库中查找,找不到就会报错。3,-L 指定库搜索路径,-l指定库名,不用加前后缀,编译的时候会补上。/////////////动态库.so/////////////////////////静态库.a////////////2, ar是归档工具,编译生成静态库.a。

2024-01-26 15:47:08 368 1

原创 gdb 调试段错误

gdb --args <可执行文件> <参数>:启动 GDB 并将参数传递给可执行文件。注:很多时候也返回不了堆栈信息,就需要加打印手动缩小范围,重点关注指针,数组等地址操作。return <表达式>:在当前函数中返回指定的表达式结果。gdb <可执行文件>:启动 GDB 并加载可执行文件。注意:源代码编译的时候要加-g选项生成调试信息。set <变量名> = <值>:修改变量的值。

2024-01-24 11:11:21 516 1

原创 面试题-代码示例输出1-n所有不重复的排列,即全排列,不能有重复数字

这个条件是成立额,5!=5就是false是0,0!=5就是ture,所以互相不等的条件不能这么判断。题目:代码示例输出1-n所有不重复的排列,即全排列,不能有重复数字。局限性:这个代码只能处理三位数,多了不行,还需优化。易错点:if (5!

2024-01-23 17:07:29 408 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除