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

Golang实践录:在go中使用curl实现https请求

之前曾经在一个 golang 工程调用 libcur 实现 https的请求,当前自测是通过的。后来迁移到另一个小系统出现段错误,于是对该模块代码改造,并再次自测。

问题提出

大约2年前,在某golang项目使用libcurl进行https请求(参见容器《Golang实践录:go-curl的使用》),由于使用的docker镜像不支持glibc,又不想重新制作,且该功能不是核心的,因此,就没有上线。现在,另一个工程也使用这个模块,迁移代码后自测出现问题。

主要出错信息如下:

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x80 addr=0x0 pc=0x7fa55160bbf4]

经定位,在调用curl_easy_perform函数时出错,回顾了curl一般写法,未发现问题,只好借助AI工具,一边提问一边搜索。

场景描述

本次重提https请求,主要是因为某个测试工程需要用https向另一个服务请求,该服务的证书固定了某个生产环境的IP,而又需要将该服务部署在测试环境,但测试环境无法使用证书,因此无法验证一些模块功能。为保证生产环境版本的正确,需要在测试环境解决证书请求问题。

在此之前,自己没有想到解决办法,问了AI,也没给出满意的回答(可能问的方式不恰当)。实际上,借助docker容器,可以很方便解决上述问题。

  • 创建docker网段,网段与生产环境的服务相同。
  • 利用容器部署上述测试工程和服务,两者在同一网段中,并且将部署服务的容器IP设置为生产环境的IP,这样使得https证书可用。
  • 在测试工程请求时,使用固定IP和固定URL请求。这样能够模拟在生产环境中的请求场景。

重新实现

核心文件代码如下:

/*
curlApi_linux.go
使用 curl 库封装的请求接口
为减少cgo开销,在 C 中实现完整的初始化、请求过程,使用静态变量减少内存碎片
编译、运行的系统必须有libcurl、libssh2等库
*/package mypostservice/*
#cgo linux LDFLAGS: -lcurl
#cgo darwin LDFLAGS: -lcurl
#cgo windows LDFLAGS: -lcurl
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>static void GetDateTimeStr(char *buf, int len)
{int Year = 0;int Month = 0;int Day = 0;int Hour = 0;int Minute = 0;int Second = 0;long mSecond = 0;struct timeval theTime;gettimeofday(&theTime, NULL);struct tm * timeinfo = localtime(&(theTime.tv_sec));Year   = 1900 + timeinfo->tm_year;Month  = 1 + timeinfo->tm_mon;Day    = timeinfo->tm_mday;Hour   = timeinfo->tm_hour;Minute = timeinfo->tm_min;Second = timeinfo->tm_sec;mSecond = theTime.tv_usec / 1000;snprintf(buf, len, "%04d%02d%02d%02d%02d%02d%03ld",Year, Month, Day, Hour, Minute, Second, mSecond);
}typedef struct {char *url;char *postfile;char *cafile;char *clifile;char *keyfile;int timeout;char *jsonStr;int jsonLen;
} CRequestParams;typedef struct {char *data;size_t len;
} CResponseData;typedef struct {char *respBody;       // 响应结果char *filename;     // 响应文件名int retcode;        // 是否成功标志
} CReturnData;static size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) {size_t realsize = size * nmemb;CResponseData *mem = (CResponseData *)userp;char *ptr = realloc(mem->data, mem->len + realsize + 1);if(!ptr) return 0;mem->data = ptr;memcpy(&(mem->data[mem->len]), contents, realsize);mem->len += realsize;mem->data[mem->len] = 0;return realsize;
}// 头部回调函数用于获取文件名
static size_t header_callback(void *ptr, size_t size, size_t nmemb, void *userdata) {char *header = strndup(ptr, size * nmemb);char *filename = (char *)userdata;// 从Content-Disposition头部提取文件名if(strstr(header, "Content-Disposition") != NULL) {char *start = strstr(header, "filename=");if(start) {start += 9; // 跳过"filename="char *end = strchr(start, ';');if(!end) end = start + strlen(start);// 去除可能的引号if(*start == '"') start++;if(*(end-1) == '"') end--;strncpy(filename, start, end - start);filename[end - start] = '\0';}}free(header);return size * nmemb;
}static CReturnData perform_request(CRequestParams *params) {CURL *curl;CURLcode res;CResponseData chunk = {0};CReturnData ret = {0};char resp_filename[128] = {0};  // 存储文件名curl_global_init(CURL_GLOBAL_ALL);curl = curl_easy_init();if(!curl) {ret.respBody = strdup("curl_easy_init failed");ret.retcode = -1;goto cleanup;}// 设置基本选项curl_easy_setopt(curl, CURLOPT_URL, params->url); // 服务器URLcurl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);  // // 设置线程安全选项curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, (long)params->timeout); // 超时时间,单位为毫秒curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, (long)params->timeout);// HTTPS设置if(strncmp(params->url, "https://", 8) == 0) {curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L);curl_easy_setopt(curl, CURLOPT_CAINFO, params->cafile);curl_easy_setopt(curl, CURLOPT_SSLCERT, params->clifile);curl_easy_setopt(curl, CURLOPT_SSLCERTPASSWD, "123456");curl_easy_setopt(curl, CURLOPT_SSLKEY, params->keyfile);curl_easy_setopt(curl, CURLOPT_SSLKEYPASSWD, "123456");}// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // 调试信息curl_easy_setopt(curl, CURLOPT_SSLVERSION, 4);// 设置回调curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);// 构建表单struct curl_httppost *formpost = NULL;struct curl_httppost *lastptr = NULL;curl_formadd(&formpost, &lastptr,CURLFORM_COPYNAME, "file",CURLFORM_BUFFER, params->postfile,CURLFORM_BUFFERPTR, params->jsonStr,CURLFORM_BUFFERLENGTH, (long)params->jsonLen,CURLFORM_CONTENTTYPE, "application/json",CURLFORM_END);curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);// 设置头部回调以获取文件名curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);curl_easy_setopt(curl, CURLOPT_HEADERDATA, resp_filename);// 执行请求res = curl_easy_perform(curl);if(res != CURLE_OK) {const char *err = curl_easy_strerror(res);ret.respBody = malloc(strlen(err) + 32);sprintf(ret.respBody, "curl_easy_perform failed: %s", err);ret.retcode = -2;goto cleanup;}// printf("debug %s %d  resp data len: \n", __func__, __LINE__, chunk.len);// 成功则复制结果if(chunk.data) {ret.respBody = strdup(chunk.data);ret.filename = strdup(resp_filename);ret.retcode = 0;} else {ret.respBody = strdup("No data received");ret.retcode = -3;}cleanup:if(chunk.data) free(chunk.data);if(formpost) curl_formfree(formpost);if(curl) curl_easy_cleanup(curl);curl_global_cleanup();return ret;
}
*/
import "C"
import ("unsafe"
)type CurlResponse struct {respBody stringfilename stringretcode  int
}type MyCURL struct {url, postfile, cafile, clifile, keyfile stringtimeout                                 int
}func NewCurl() *MyCURL {return &MyCURL{timeout: 5000, // 默认超时}
}func (c *MyCURL) SetOpt(url, postfile, cafile, clientfile, keyfile string, timeout int) {c.url = urlc.postfile = postfilec.cafile = cafilec.clifile = clientfilec.keyfile = keyfilec.timeout = timeout
}func (c *MyCURL) PostFiledata(jsonStr []byte) CurlResponse {// 将 Go的json数据复制到C的内存中cJsonStr := C.CBytes(jsonStr)defer C.free(cJsonStr)params := C.CRequestParams{url:      C.CString(c.url),postfile: C.CString(c.postfile),cafile:   C.CString(c.cafile),clifile:  C.CString(c.clifile),keyfile:  C.CString(c.keyfile),timeout:  C.int(c.timeout),jsonStr:  (*C.char)(cJsonStr), // 使用C分配的内存jsonLen:  C.int(len(jsonStr)),}defer func() {C.free(unsafe.Pointer(params.url))C.free(unsafe.Pointer(params.cafile))C.free(unsafe.Pointer(params.clifile))C.free(unsafe.Pointer(params.keyfile))}()// 调用C函数并获取返回结构体cRet := C.perform_request(&params)defer func() {C.free(unsafe.Pointer(cRet.respBody))C.free(unsafe.Pointer(cRet.filename))}()// 转换为Go结构体return CurlResponse{respBody: C.GoString(cRet.respBody),filename: C.GoString(cRet.filename),retcode:  int(cRet.retcode),}
}

与上一版本对比,有如下调整:

  • #cgo linux pkg-config: libcurl改为#cgo linux LDFLAGS: -lcurl,对编译环境较友好一些。
  • 将全局变量改为局域变量,防止多线程情况下出现问题。
  • 上版本返回值使用换行符进行解析,现改为返回多个值(go语言本身支持),代码较友好。

测试

与curl请求有关的输出信息如下:

 * About to connect() to 172.18.18.10 port 86 (#4)*   Trying 172.18.18.10...* Connected to 172.18.18.10 (172.18.18.10) port 86 (#4)* Initializing NSS with certpath: sql:/etc/pki/nssdb*   CAfile: ../../../cert/all.pemCApath: none* SSL connection using ECDHE-RSA-AES256-GCM-SHA384* Server certificate:*        subject: CN=172.18.18.10*        start date: 2023-02-16 08:19:00 GMT*        expire date: 2033-02-16 08:19:00 GMT> POST /mypost/foobar HTTP/1.1Host: 172.18.18.10:86Content-Length: 799Expect: 100-continueContent-Type: multipart/form-data; boundary=----------------------------258acabf1379< HTTP/1.1 100 Continue< HTTP/1.1 200 OK< Server: nginx/1.16.1< Date: Sun, 14 May 2025 18:20:48 GMT< Content-Type: application/json< Content-Length: 1083< Connection: keep-alive< Content-Disposition: form-data;filename=bar.json<* Connection #4 to host 172.18.18.10 left intact

小结

上述代码目前只在测试环境测试,后续择机在生产环境中使用。就测试结果看,应该是没有大问题的。

相关文章:

Golang实践录:在go中使用curl实现https请求

之前曾经在一个 golang 工程调用 libcur 实现 https的请求&#xff0c;当前自测是通过的。后来迁移到另一个小系统出现段错误&#xff0c;于是对该模块代码改造&#xff0c;并再次自测。 问题提出 大约2年前&#xff0c;在某golang项目使用libcurl进行https请求&#xff08;参…...

nvrtc环境依赖

一 下载 1.1 添加nvidia的源&#xff08;不同于pypi&#xff09; pip install nvidia-pyindex 1.2 pip dowload 执行 pip download nvidia-cuda-runtime nvidia-cuda-python 会发现文件夹多了以下几个文件 而需要安装的则只有红框的三个文件&#xff0c; 二 安装 对红框的…...

【计算机视觉】OpenCV实战项目:GraspPicture 项目深度解析:基于图像分割的抓取点检测系统

GraspPicture 项目深度解析&#xff1a;基于图像分割的抓取点检测系统 一、项目概述项目特点 二、项目运行方式与执行步骤&#xff08;一&#xff09;环境准备&#xff08;二&#xff09;项目结构&#xff08;三&#xff09;执行步骤 三、重要逻辑代码解析&#xff08;一&#…...

Redis持久化存储

我们知道Redis是将数据放在内存中的,那怎么做到持久化存储呢?很简单,就是内存存一份,硬盘也存一份.那么两个地方都存会不会影响效率?答案是影响是不大的,要看具体的策略.同时也要注意内存的数据和硬盘中的数据可能会有一点不同.这也是取决于策略的不同. Redis持久化存储的两个…...

网络检测工具InternetTest v8.9.1.2504 单文件版,支持一键查询IP/DNS、WIFI密码信息

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://drive.uc.cn/s/295e068b79314 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOQDXguH0DYPxrql5y2zlkhTA1?pwdg2nx# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…...

elpis-core: 基于 Koa 实现 web 服务引擎架构设计解析

前言 内容来源于抖音【哲玄前端】大佬的《大前端全栈实践》课程&#xff0c;此课程是从零开始做一个企业级的全栈应用框架。此框架是基于koa.js构建的服务引擎&#xff0c;对BFF层的框架封装&#xff0c;让我感受颇深。 整体elpis项目架构设计 elpis-core设计思路 可以看到elpi…...

计算机网络-MPLS LDP基础实验配置

前面我们学习了LDP的会话建立、标签发布与交换、LDP的工作原理&#xff0c;今天通过一个基础实验来加深记忆。 一、LDP基础实验 实验拓扑&#xff1a; 1、IGP使用OSPF进行通告&#xff0c;使用Lookback接口作为LSR ID&#xff0c;LDP ID自动生成。 2、实验目的&#xff1a;使…...

搜索二维矩阵 II

存储m和n&#xff0c;用i表示行&#xff0c;j表示列&#xff0c;i从最后一行开始遍历&#xff0c;j从0开始遍历&#xff0c;当前值比目标值小j&#xff0c;反之i-- class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int…...

C++中如何实现一个单例模式?

单利模式是指对象在整个程序中只有一个实例&#xff0c;提供一个访问方法供全局访问。实现单例模式有如下要求&#xff1a; 1.私有化构造函数&#xff1a;将构造函数定义为私有&#xff0c;以防外部通过构造函数创建其它实例。 2.静态实例&#xff1a;在内部提供一个静态实例…...

进程与线程

进程与线程:计算机世界的"公司与员工" 进程与线程的本质区别 进程(Process)是计算机中独立运行的程序实例,拥有自己的内存空间和系统资源;而线程(Thread)是进程内的执行单元,共享所属进程的资源,但拥有独立的执行路径。 🏢 生活类比:想象一个大型企业的运…...

JDK 命令行工具大全与学习方法总结 —— 从帮助文档到高效实践

JDK 命令行工具大全与学习方法总结 —— 从帮助文档到高效实践 Java开发与运维过程中&#xff0c;JDK自带的命令行工具是定位问题、性能调优、编译调试的基石。本文全面梳理JDK常用命令工具、帮助文档的获取方式&#xff0c;并总结类似Linux命令行的学习方法&#xff0c;助你系…...

行业趋势与技术创新:驾驭工业元宇宙与绿色智能制造

引言 制造业发展的新格局&#xff1a;创新势在必行 当今制造业正经历深刻变革&#xff0c;面临着供应链波动、个性化需求增长、可持续发展压力以及技能人才短缺等多重挑战。在这样的背景下&#xff0c;技术创新不再是可有可无的选项&#xff0c;而是企业保持竞争力、实现可持…...

代码随想录算法训练营第三十九天(打家劫舍专题) | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

一、198.打家劫舍 题目链接&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode&#xff1a;198.打家劫舍_哔哩哔哩_bilibili 1. 思路 大家如…...

Linux514 rsync 解决方案环境配置

节点ab都改为NAT模式 网关和VMnet8网卡不一致 ping 不通外网 ping不通外网 是这里的问题吗 怎么突然就ping通了 没改啥啊 上面改了dhcp范围后 ping还是ping不通 为啥现在又ping通了 设置节点b 推测应该是dhcp范围问题 今日源码 节点b MX...

STM32F103_LL库+寄存器学习笔记23 - PWM波形输出及软件方式调整周期与占空比

导言 脉宽调制&#xff08;PWM&#xff09;是 STM32 定时器最常用的输出模式之一&#xff0c;广泛应用于电机驱动、LED 调光、伺服控制和功率管理等场景。本篇文章将以 TIM5 为例&#xff0c;从寄存器层面深入剖析 PWM 输出的原理与实现步骤。通过本篇博客&#xff0c;你不仅能…...

Canvas知识框架

一、Canvas基础 核心概念 Canvas是位图绘图区域&#xff0c;通过JavaScript&#xff08;或Python等&#xff09;动态绘制图形。 坐标系&#xff1a;左上角为原点 (0, 0)&#xff0c;x向右递增&#xff0c;y向下递增。 绘图流程&#xff1a; const canvas document.getElemen…...

【SSL证书系列】客户端如何验证https网站服务器发的证书是否由受信任的根证书签发机构签发

客户端验证HTTPS网站证书是否由受信任的根证书颁发机构&#xff08;CA&#xff09;签发&#xff0c;是一个多步骤的过程&#xff0c;涉及证书链验证、信任锚&#xff08;Trust Anchor&#xff09;检查、域名匹配和吊销状态验证等。以下是详细的验证流程&#xff1a; 1. 证书链的…...

spark小任务

import org.apache.spark.{Partitioner, SparkConf, SparkContext}object PartitionCustom {// 分区器决定哪一个元素进入某一个分区// 目标: 把10个分区器&#xff0c;偶数分在第一个分区&#xff0c;奇数分在第二个分区// 自定义分区器// 1. 创建一个类继承Partitioner// 2. …...

git push 报错:send-pack: unexpected disconnect while reading sideband packet

背景 新建了一个仓库&#xff0c;第一次push 代码文件&#xff0c;文件中有一个依赖的jar&#xff0c;有80MB&#xff0c;结果push的时候报错。 错误信息 error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500 send-pack: unexpected disconnect whi…...

读入csv文件写入MySQL

### 使用 Spark RDD 读取 CSV 文件并写入 MySQL 的实现方法 #### 1. 环境准备 在使用 Spark 读取 CSV 文件并写入 MySQL 数据库之前&#xff0c;需要确保以下环境已配置完成&#xff1a; - 添加 Maven 依赖项以支持 JDBC 连接。 - 配置 MySQL 数据库连接参数&#xff0c;包括 …...

5.18-AI分析师

强化练习1 神经网络训练案例&#xff08;SG&#xff09; #划分数据集 #以下5行需要背 folder datasets.ImageFolder(rootC:/水果种类智能训练/水果图片, transformtrans_compose) n len(folder) n1 int(n*0.8) n2 n-n1 train, test random_split(folder, [n1, n2]) #训…...

腾讯云运营开发 golang一面

redis为什么单线程会快 每秒10w吞吐量 io多路复用 一个文件描述符整体拷贝&#xff1b;调用epoll_ctl 单个传递 内核遍历文件描述符判断是否有事件发送&#xff1b;回调函数列表维护 修改有事件发送的socket为可读或可写&#xff0c;返回整个文件描述符&#xff1b;返回链…...

spark数据压缩

### Spark 数据压缩方法及其实现 在大数据处理框架中&#xff0c;数据压缩是一个重要的环节&#xff0c;它不仅能够减少磁盘占用空间&#xff0c;还能降低网络传输成本。然而&#xff0c;在分布式计算环境中&#xff08;如 Spark&#xff09;&#xff0c;选择合适的压缩编解码…...

synchronized关键字详解

synchronized关键字详解 1. 基本概念与使用方式 作用:确保多个线程在访问共享资源时的互斥性,防止数据不一致。使用方式: 修饰实例方法:锁对象为当前实例(this)。public synchronized void instanceMethod() {// 同步代码 }修饰静态方法:锁对象为类的Class对象。public…...

React useState 的同步/异步行为及设计原理解析

一、useState 的同步/异步行为 异步更新&#xff08;默认行为&#xff09; • 场景&#xff1a;在 React 合成事件&#xff08;如 onClick&#xff09;或生命周期钩子&#xff08;如 useEffect&#xff09;中调用 useState 的更新函数时&#xff0c;React 会将这些更新放入队列…...

《社交应用动态表情:RN与Flutter实战解码》

React Native依托于JavaScript和React&#xff0c;为动态表情的实现开辟了一条独特的道路。其核心优势在于对原生模块的便捷调用&#xff0c;这为动态表情的展示和交互提供了强大支持。在社交应用中&#xff0c;当用户点击发送动态表情时&#xff0c;React Native能够迅速调用相…...

【Oracle专栏】清理告警日志、监听日志

Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 今天在导入数据库时,发现之前可以导入,今天导入时居然报空间不足,于是检查是哪里占用空间比较大。检查回收站、归档日志,发现没有。然后检查告警日志、监听日志,发现果然占用空间比较大,于是进行…...

Ubuntu24.04编译ORB_SLAM的一系列报错解决

Ubuntu24.04编译ORB_SLAM的一系列报错解决 decay_t报错 报错信息&#xff1a;error: ‘decay_t’ is not a member of ‘std’&#xff1b;did you mean ‘decay’ 将CMakeLists.txt中第17行的c标准修改为c14即可&#xff1a; 修改前&#xff1a; CHECK_CXX_COMPILER_FLAG…...

Python × CARLA:如何在自动驾驶仿真世界里打造智能驾驶系统?

Python CARLA:如何在自动驾驶仿真世界里打造智能驾驶系统? 在人工智能与自动驾驶的浪潮中,真实世界的测试成本高昂,而自动驾驶仿真已成为开发者训练和测试 AI 驾驶算法的关键技术手段。其中,CARLA(Car Learning to Act)作为开源自动驾驶仿真平台,凭借其真实感强、高度…...

如何迁移 WSL 卸载 Ubuntu WSL

迁移 WSL 到其他盘区 假设您已经安装了 WSL 上的 Ubuntu 22.04 LTS&#xff0c;并且想要将其从 C 盘迁移到 D 盘。 查看 WSL 状态&#xff1a; 打开 PowerShell 或 CMD&#xff0c;运行以下命令查看当前安装的 WSL 发行版&#xff1a; wsl -l -v假设输出显示 Ubuntu-22.04 正在…...

【Linux】多路转接epoll、Linux高并发I/O多路复用

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;五种IO模型与阻塞IO以及多路转接select机制编写echoserver 下篇文章…...

【taro3 + vue3 + webpack4】在微信小程序中的请求封装及使用

前言 正在写一个 以taro3 vue3 webpack4为基础框架的微信小程序&#xff0c;之前一直没有记咋写的&#xff0c;现在总结记录一下。uniapp vite 的后面出。 文章目录 前言一、创建环境配置文件二、 配置 Taro 环境变量三、 创建请求封装四、如何上传到微信小程序体验版1.第二…...

在python中使用Json提取数据

文章目录 一、前言二、格式转换2.1 dumps函数2.2 loads函数2.3 错误处理 三、JSONPath模块四、JMESPath模块4.1 search函数4.2 基本语法4.2.1 基本查询4.2.2 投影4.2.3 管道4.2.4 多选4.2.5 函数 一、前言 官方文档&#xff1a;https://docs.python.org/zh-cn/3.12/library/js…...

备战菊厂笔试4

目录 39.组合总和 回溯&#xff08;单向剪枝&#xff09; 3102.最小化曼哈顿距离 利用曼哈顿距离的性质 3163.压缩字符串3 46.全排列 53.最大子数组和 39.组合总和 39. 组合总和 注意&#xff1a; set不能添加list得加元组 元组不可修改 sorted后得赋值 class So…...

白盒测试——基本路径测试法

一、实验名称 白盒测试——基本路径测试法 二、实验目的 白盒测试是结构测试&#xff0c;是依据被测程序的内部逻辑结构设计测试用例&#xff0c;驱动被测程序运行完成的测试&#xff0c;通过本实验希望&#xff1a; 1、掌握基本路径测试法的基本概念&#xff0c;用具体的例子…...

FFmpeg 与 C++ 构建音视频处理全链路实战(五)—— 音视频编码与封装

在前面的系列文章中&#xff0c;我们已经层层深入&#xff0c;从 MP4 与 FLV 封装格式的剖析&#xff0c;到 H.264 和 AAC 原理的探索&#xff0c;再到 FFmpeg 的解封装、解码&#xff0c;以及音频重采样、视频尺寸变化的代码实现&#xff0c;为音视频处理打下了坚实基础。而今…...

NNLM神经网络语言模型总结

一开始还以为很复杂&#xff0c;总结一下就是&#xff1a; NNLM 将某个单词前 n−1 个词各自转为 embedding&#xff0c;拼接成一个 (n−1)⋅d 维的向量&#xff0c;再通过隐藏层 输出层 softmax&#xff0c;预测下一个词的概率分布 可以发现&#xff0c;这个2003年提出的模…...

开源Heygem本地跑AI数字人视频教程

图文教程&#xff1a; 点击跳转 视频教程 资料包下载 点击下载&#xff1a;...

软件验收测试有哪些流程?与确认测试又有什么不同?

随着信息技术的飞速发展&#xff0c;软件的应用覆盖面越来越广泛&#xff0c;软件验收测试的重要性也愈发显著。软件验收测试是指在软件开发完成后&#xff0c;对软件进行的最后一次全面审核&#xff0c;以确保软件的功能和性能满足用户需求。这一阶段通常由客户进行&#xff0…...

一文了解 HTTP Content-Type:从基础到实战

一文了解 HTTP Content-Type&#xff1a;从基础到实战 在 Web 开发中&#xff0c;HTTP 请求头中的 Content-Type 是一个看似简单却至关重要的概念。它决定了浏览器和服务器如何解析和处理传输的数据。本文将带你全面掌握 Content-Type 的核心知识&#xff0c;涵盖常见类型、应…...

数学建模初等模型应用

一、目的 掌握初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。 二、实验内容与设计思想&#xff08;设计思路、主要代码分析&#xff09; 1、预测鱼的质量 &#xff08;1&#xff09;设计思路&#xff1a;使用线性回归模型预测鱼的质量…...

map和unordered_map

一、map和unordered_map的基本概念——它们是啥&#xff1f; map&#xff1a;是一种“有序的关联容器”&#xff0c;存放一组“键值对”&#xff0c;内部元素按键排序&#xff08;默认是升序&#xff09;&#xff0c;类似一本按字母排序的字典。 unordered_map&#xff1a;也是…...

【vue】脚手架

一、使用脚手架创建项目 1.打开编辑器终端 2.输入命令vue create 项目名 3.选择自定义配置&#xff0c;选以下几种常用的配置项&#xff08;空格选中或删除&#xff09; 二、常规操作 进入项目&#xff1a;cd 项目名 返回&#xff1a;cd .. 运行项目:npm run serve 停止项目:ct…...

PaddleNLP框架训练模型:使用SwanLab教程

PaddleNLP 是一款基于飞桨深度学习框架的大语言模型(LLM)开发套件&#xff0c;支持在多种硬件上进行高效的大模型训练、无损压缩以及高性能推理。PaddleNLP 具备简单易用和性能极致的特点&#xff0c;致力于助力开发者实现高效的大模型产业级应用。 你可以使用PaddleNLP快速进行…...

单向循环链表C语言实现实现(全)

#include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FASLE 0//定义宏标识判断是否成功 typedef struct Node {int data;struct Node* next; }Node;Node* InitList() {Node* list (Node*)malloc(sizeof(Node));list->data 0;//创建节点保存datalist…...

数据结构:ArrayList简单实现与常见操作实例详解

目录 1.顺序表概念 2.自己实现 1.准备工作 接口 MyArrayList的定义 2.具体接口实现 添加 判满 扩容 查找 获得pos位置的值 和 更改pos位置的值 判空 删除 得到数组长度 清空数组 打印 3.ArrayList 1.简介 2.使用 1.ArrayList的构造 无参构造 有参构造&a…...

C++之fmt库介绍和使用(1)

C之fmt库介绍与使用(1) Author: Once Day Date: 2025年5月12日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...

嵌入式自学第二十一天(5.14)

gdb逻辑调试器: gcc 调试&#xff0c;发行版 gcc -g 调试版本&#xff0c;体积大&#xff0c;有源码。 一般调试&#xff1a;gdb a.out b n.c:行数 &#xff1a;设置断点&#xff0c;运行到这个位置&#xff0c;程序暂停。&#xff08;可以直接加行数&#xff09; r运行 n执行下…...

位与运算

只有当除数是 2 的幂次方&#xff08;如 2、4、8、16...&#xff09;时&#xff0c;取模运算才可以转换为位运算。 int b 19;int a1 b % 16; // 传统取模运算int a2 b & 15; // 位运算替代取模printf("b %d\n", b);printf("b %% 8 %d\n",…...

SparkSQL操作Mysql(2)

创建数据库和表 我们去创建一个新的数据库&#xff0c;数据表&#xff0c;并插入一条数据。 参考代码如下&#xff1a; -- 创建数据库 CREATE DATABASE spark; -- 使用数据库 USE spark; -- 创建表 create table person(id int, name char(20), age int); -- 插入示例数…...