C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输
CURL开源库介绍
CURL 是一个功能强大的开源库,用于在各种平台上进行网络数据传输。它支持众多的网络协议,像 HTTP、HTTPS、FTP、SMTP 等,能让开发者方便地在程序里实现与远程服务器的通信。
CURL 可以在 Windows、Linux、macOS 等多种操作系统上使用;
CURL 支持多种网络协议,能处理复杂的网络请求,如设置请求头、处理 cookies、上传和下载文件等。
使用前,编译CURL 源码,生成动态库,引入时包括头文件一起,网上也有别人已经编译好的现成的库可以下载使用。

生成的库:

在你要使用的项目里加上curl的头文件
#include <curl\curl.h>
这下你就可以使用CURL里的接口完成功能了。
CURL常用的接口说明:
- 初始化与清理相关的接口:
- curl_easy_init()
功能:创建并初始化一个新的 CURL 句柄,用于后续的网络操作。这个句柄就像一个会话的载体,后续的请求设置和执行都围绕它展开。
返回值:成功时返回一个指向新创建的 CURL 句柄的指针;失败则返回 NULL。 - curl_easy_cleanup(CURL *handle)
功能:释放 CURL 句柄占用的所有资源,包括内存、网络连接等。在使用完 CURL 句柄后,必须调用此函数以避免资源泄漏。
参数:handle 是之前通过 curl_easy_init() 得到的 CURL 句柄。
- 请求选项设置相关的接口:
- curl_easy_setopt(CURL *handle, CURLoption option, …)
功能:设置 CURL 句柄的各种选项,这些选项可以控制请求的各个方面,如请求的 URL、请求方法、请求头、回调函数等。
参数:
handle:CURL 句柄。
option:CURLoption 类型的常量,指定要设置的选项。
可变参数:根据不同的 option,需要传入相应的参数值。
常用 option 有:
CURLOPT_URL:设置请求的 URL。
CURLOPT_POST:将请求方法设置为 POST。
CURLOPT_HTTPHEADER:设置请求头。
CURLOPT_POSTFIELDS:设置 POST 请求的数据。 - curl_slist_append(struct curl_slist *list, const char *string)
功能:用于构建一个链表来存储请求头信息。每次调用该函数可以将一个新的请求头字符串添加到链表中。
参数:
list:指向 curl_slist 链表的指针,如果是第一次添加,可传入 NULL。
string:要添加的请求头字符串,格式为 Header-Name: Header-Value。
返回值:返回更新后的链表指针。
- 回调函数设置相关的接口:
- CURLOPT_WRITEFUNCTION 和 CURLOPT_WRITEDATA
功能:CURLOPT_WRITEFUNCTION:设置一个回调函数,当服务器返回响应数据时,CURL 会调用该回调函数来处理响应数据。
CURLOPT_WRITEDATA:传递一个用户自定义的指针给回调函数,用于在回调函数中存储或处理数据。 - CURLOPT_READFUNCTION 和 CURLOPT_READDATA
功能:CURLOPT_READFUNCTION:设置一个回调函数,用于在发送数据时从用户提供的数据源中读取数据。
CURLOPT_READDATA:传递一个用户自定义的指针给回调函数,用于标识数据源。
- 多线程与异步操作相关的接口:
- curl_multi_init()
功能:初始化一个 CURLM 句柄,用于多线程或异步的网络操作。该句柄可以管理多个 CURL 句柄,实现并发请求。
返回值:成功时返回一个新的 CURLM 句柄指针;失败返回 NULL。 - curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle)
功能:将一个 CURL 句柄添加到 CURLM 句柄管理的句柄列表中,以便进行并发处理。
参数:
multi_handle:CURLM 句柄。
easy_handle:要添加的 CURL 句柄。 - curl_multi_perform(CURLM *multi_handle, int *still_running)
功能:在 CURLM 句柄管理的所有 CURL 句柄上执行网络操作。该函数会尝试处理尽可能多的请求,并返回仍在运行的请求数量。
参数:
multi_handle:CURLM 句柄。
still_running:指向一个整数的指针,用于存储仍在运行的请求数量。 - curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle)
功能:从 CURLM 句柄管理的句柄列表中移除一个 CURL 句柄。
参数:
multi_handle:CURLM 句柄。
easy_handle:要移除的 CURL 句柄。 - curl_multi_cleanup(CURLM *multi_handle)
功能:释放 CURLM 句柄占用的所有资源。在使用完 CURLM 句柄后,必须调用此函数进行清理。
参数:multi_handle 是 CURLM 句柄。
接口流程使用:
简单的同步调用模式的使用流程:
- 调用curl_global_init()初始化libcurl ;
- 调用curl_easy_init()函数得到 easy;
- interface型指针 调用curl_easy_setopt()设置传输选项;
- 根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务;
- 调用curl_easy_perform()函数完成传输任务,返回错误码 ;
- 调用curl_easy_cleanup()释放内存;
- 调用curl_global_cleanup() (可以不用调用);
在整过过程中设置curl_easy_setopt()参数是最关键的,了解相关参数及对应作用很重要。
举例说明CURL的调用实现
//http回调写函数
static size_t CurlWriteBuffer(char *buffer, size_t size, size_t nmemb, std::string* stream)
{//第二个参数为每个数据的大小,第三个为数据个数,最后一个为接收变量size_t sizes = size*nmemb;if(stream == NULL) return 0;stream->append(buffer,sizes);return sizes;
}//http发送封装
int HttpClient::posturl(std::string& msg, std::string& url, bool IsSSL)
{CURL* pCurl=NULL; //一个libcurl的handleCURLcode res; //返回状态码std::string response; //返回信息curl_global_init(CURL_GLOBAL_ALL); //全局初始化pCurl = curl_easy_init(); //创建一个handle//设置请求头struct curl_slist* pHeader = NULL;//传json格式,字符编码为utf8header_ = curl_slist_append(pHeader ,"Content-Type: application/json;charset=utf-8");//添加请求头到handlecurl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pHeader );//设置URLcurl_easy_setopt(pCurl, CURLOPT_URL, url.c_str()); CURLOPT_WRITEFUNCTION 将后继的动作交给write_data函数处理curl_easy_setopt(pCurl,CURLOPT_POSTFIELDS,msg.c_str()); //post请求消息数据 curl_easy_setopt(pCurl,CURLOPT_POSTFIELDSIZE,msg.length()); //消息长度curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, CurlWriteBuffer); //回调函数curl_easy_setopt(pCurl,CURLOPT_WRITEDATA,&response); //数据接收变量curl_easy_setopt(pCurl,CURLOPT_TIMEOUT,m_settinginfo.m_http_timeout); //连接超时时间//不支持ssl验证if(m_settinginfo.m_ssl == 0){curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0);//设定为不验证证书和HOSTcurl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0);}else{// 配置 https 请求所需证书if (m_settinginfo.m_ssl == 1) //ssl单向验证,不验证服务器{curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 0L); }else{//双向验证curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, 1L);curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, 0);curl_easy_setopt(pCurl,CURLOPT_CAINFO,ca_info.ca_path.c_str()); }//设置客户端信息curl_easy_setopt(pCurl, CURLOPT_SSLCERT, ca_info.client_cert_path.c_str());curl_easy_setopt(pCurl,CURLOPT_SSLCERTTYPE,"PEM"); curl_easy_setopt(pCurl, CURLOPT_SSLKEY, ca_info.client_key_path.c_str());curl_easy_setopt(pCurl,CURLOPT_SSLKEYTYPE,"PEM"); //如果客户端证书密钥使用密码加密,设置加密密码//curl_easy_setopt(pCurl, CURLOPT_KEYPASSWD, "your_key_password");}//执行http连接res = curl_easy_perform(pCurl);//清除消息头curl_slist_free_all(pHeader);//清除handlecurl_easy_cleanup(pCurl);return 0;
}
再看一段完整的CURL封装成get,post等形式,进行字串传输和文件上传的请求,可以直接拿去使用。
//Http的Get请求
int HttpClient::ExecuteGetRequestCURL(const char* strUrl, const char* pszGet, const char* pszCookie, int nTimeOut)
{CURLcode res;m_strResponse = "";struct curl_slist* headers = NULL;CURL* curl = curl_easy_init();if (NULL == curl){return CURLE_FAILED_INIT;}std::string strOutData = strUrl;strOutData += pszGet;curl_easy_setopt(curl, CURLOPT_URL, strOutData.c_str());curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&m_strResponse);/*** 当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。* 如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。*/curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);//连接超时设置10s,数据请求超时设置60scurl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeOut);res = curl_easy_perform(curl);if (res != CURLE_OK)m_strResponse = "";curl_easy_cleanup(curl);return res;
}
//Http的post请求
int HttpClient::ExecutePostRequestCURL(const char* strUrl, const char* pszKey, const char* pszPost, const char* pszCookie, int nTimeOut)
{CURLcode res;m_strResponse = "";CURL* curl = curl_easy_init();if (NULL == curl){return CURLE_FAILED_INIT;}///struct curl_slist* headerlist = NULL;struct curl_httppost* formpost = NULL;struct curl_httppost* last = NULL;//headerlist = curl_slist_append(headerlist, "Content-Type:application/json;charset=UTF-8");//curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);res = curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip, deflate, br");//设置CURLOPT_ACCEPT_ENCODING (7.21.8之前为CURLOPT_ENCODING )if (CURLE_OK != res){curl_easy_cleanup(curl);return CURLE_FAILED_INIT;}curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);if (CURLE_OK != res){curl_easy_cleanup(curl);return CURLE_FAILED_INIT;}curl_formadd(&formpost, &last, CURLFORM_PTRNAME, pszKey, CURLFORM_PTRCONTENTS, pszPost, CURLFORM_END); //以这种方式上传可以避免特殊字符被改变if (CURLE_OK != res){curl_easy_cleanup(curl);return CURLE_FAILED_INIT;}curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); //构造post参数 if (CURLE_OK != res){curl_easy_cleanup(curl);return CURLE_FAILED_INIT;}/curl_easy_setopt(curl, CURLOPT_URL, strUrl);if (CURLE_OK != res){curl_easy_cleanup(curl);return CURLE_FAILED_INIT;}//curl_easy_setopt(curl, CURLOPT_POST, 1);//curl_easy_setopt(curl, CURLOPT_POSTFIELDS, pszPost);curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);if (CURLE_OK != res){curl_easy_cleanup(curl);return CURLE_FAILED_INIT;}curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);if (CURLE_OK != res){curl_easy_cleanup(curl);return CURLE_FAILED_INIT;}curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&m_strResponse);if (CURLE_OK != res){curl_easy_cleanup(curl);return CURLE_FAILED_INIT;}curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);if (CURLE_OK != res){curl_easy_cleanup(curl);return CURLE_FAILED_INIT;}if ((pszCookie != NULL)&&(strlen(pszCookie)>0)){ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, (void *)&pszCookie);curl_easy_setopt(curl, CURLOPT_COOKIEJAR, (void *)&pszCookie);}//连接超时设置,数据请求超时设置curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeOut);res = curl_easy_perform(curl);if (res != CURLE_OK){m_strResponse = "";// 获取详细错误信息const char* szErr = curl_easy_strerror(res);fprintf(stderr, "curl_easy_perform() failed: %s\n", szErr);}// 清空curl_easy_cleanup(curl);// 释放表单curl_formfree(formpost);// 释放表头curl_slist_free_all (headerlist); return res;
}//https的Get请求
int HttpClient::ExecuteHttpsGetCURL(const std::string & strUrl, const char* pszGet, const char * pCaPath, int nTimeOut)
{CURLcode res;CURL* curl = curl_easy_init();if (NULL == curl){return CURLE_FAILED_INIT;}std::string strOutData = strUrl;strOutData += pszGet;curl_easy_setopt(curl, CURLOPT_URL, strOutData.c_str());curl_easy_setopt(curl, CURLOPT_HEADER, 0 ); curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&m_strResponse);curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeOut);if (NULL == pCaPath){curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);}else{curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);}curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);//curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);//curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);//curl_easy_setopt(curl,CURLOPT_TRANSFERTEXT,1); res = curl_easy_perform(curl);if (res != CURLE_OK)m_strResponse = "";curl_easy_cleanup(curl);return res;
}//https的Post请求
int HttpClient::ExecuteHttpsPostCURL(const std::string& strUrl, const std::string& strKey, const std::string& strPost, const std::string& strCookie, const char* pCaPath, int nTimeOut)
{CURLcode res;CURL* curl = curl_easy_init();if (NULL == curl){return CURLE_FAILED_INIT;}///struct curl_slist* headers = NULL;struct curl_httppost* post = NULL;struct curl_httppost* last = NULL;curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, "gzip, deflate, br");//设置CURLOPT_ACCEPT_ENCODING (7.21.8之前为CURLOPT_ENCODING )curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);curl_formadd(&post, &last, CURLFORM_PTRNAME, strKey.c_str(), CURLFORM_PTRCONTENTS, strPost.c_str(), CURLFORM_END); //以这种方式上传可以避免特殊字符被改变curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); //构造post参数curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
// curl_easy_setopt(curl, CURLOPT_POST, 1);
// curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str());curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData);curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&m_strResponse);curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);//curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60*5);//curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60*5);if (strCookie.length()>0){curl_easy_setopt(curl, CURLOPT_COOKIEFILE, (void *)&strCookie);curl_easy_setopt(curl, CURLOPT_COOKIEJAR, (void *)&strCookie);}if (NULL == pCaPath){//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);}else{//缺省情况就是PEM,所以无需设置,另外支持DER//curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true);curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath);}curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 20);curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeOut);curl_easy_setopt(curl, CURLOPT_SSLVERSION, 3);res = curl_easy_perform(curl);curl_easy_cleanup(curl);return res;
}static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid)
{ std::string* str = reinterpret_cast<std::string*>(lpVoid);if (NULL == str || NULL == buffer){return -1;}char* pData = reinterpret_cast<char*>(buffer);str->append(pData, size * nmemb);return nmemb;
}long HttpClient::GetRespone(char* pszResponse, long &lRespLen)
{long lRet = 0;if (m_strResponse.length() <= 0){lRet = 1;goto err;}if (pszResponse == NULL){lRespLen = m_strResponse.length();goto err;}if (lRespLen < m_strResponse.length()){lRet = 1;goto err;}memset(pszResponse, 0, lRespLen);memcpy(pszResponse, m_strResponse.c_str(), m_strResponse.length());lRespLen = m_strResponse.length();
err:return lRet;
}long HttpClient::GetFileNameAndExt(const std::string & strFilePath,std::string & strFileName,std::string & strFileExt)
{long lRet = 0;strFileExt = "";strFileName = "";int nPos = strFilePath.rfind('.');if (nPos == -1){lRet = CURLE_FAILED_INIT; //文件不存在goto err;}strFileExt = strFilePath.substr(nPos+1, strFilePath.length());nPos = strFilePath.rfind('\\');if (nPos == -1){nPos = strFilePath.rfind('/');if (nPos == -1){strFileName = strFilePath;goto err;}}strFileName = strFilePath.substr(nPos+1, strFilePath.length());
err:return lRet;
}
//Http的post传文件请求
//strParamName是"bindingSeal",strParamVal值是对应的json包,strParamName2是"sealImages",strParamVal2值是图片名称
long HttpClient::HttpUploadFileCURL(LPCTSTR strUrl, const string& strFilePath, const string& strParamName, const string& strParamVal, const string& strParamName2, const string& strParamVal2, string& strResponse)
{CURL* curl;CURLcode res;long lRet = 0;std::string strFileName;std::string strFileExt;StringTool strTool;string strCRUL = strTool.WideToAsc(strUrl);lRet = GetFileNameAndExt(strFilePath, strFileName, strFileExt);if (lRet != 0)goto err;curl = curl_easy_init();struct curl_httppost* post = NULL;struct curl_httppost* last = NULL;if (curl == NULL){lRet = CURLE_FAILED_INIT;goto err;}curl_easy_setopt(curl, CURLOPT_URL, (char *)strCRUL.c_str()); //指定url//form-data key(path) 和 value(device_cover)curl_formadd(&post, &last, CURLFORM_PTRNAME, strParamName.c_str()/*"parma"*/, CURLFORM_PTRCONTENTS, strParamVal.c_str(), CURLFORM_END);curl_formadd(&post, &last, CURLFORM_PTRNAME, strParamName2.c_str(), CURLFORM_FILE, strFilePath.c_str(),CURLFORM_FILENAME, strFileName.c_str(),CURLFORM_CONTENTTYPE,"image/png", CURLFORM_END);//curl_formadd(&post, &last, CURLFORM_PTRNAME, strParamName2.c_str(), CURLFORM_FILE, strFilePath.c_str(),CURLFORM_FILENAME, strFileName.c_str(),CURLFORM_CONTENTTYPE,"image/PNG", CURLFORM_END);curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); //构造post参数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); //绑定相应curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse); //绑定响应内容的地址res = curl_easy_perform(curl); //执行请求if(res == 0){curl_easy_cleanup(curl); lRet = res;goto err;}else{lRet = res;goto err;}lRet = res;err:return lRet;
}
相关文章:
C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输
CURL开源库介绍 CURL 是一个功能强大的开源库,用于在各种平台上进行网络数据传输。它支持众多的网络协议,像 HTTP、HTTPS、FTP、SMTP 等,能让开发者方便地在程序里实现与远程服务器的通信。 CURL 可以在 Windows、Linux、macOS 等多种操作系…...
浙江大华社招面试
下面是我之前社招面试大华时,面得是嵌入式Linux系统工程师,下面是我初试所被问到的问题分享给大家 毕业之后工作负责过哪些产品,工作负责哪些内容 Camera相关 1、调试sensor是多少像素 2、板子上怎么连接sensor 3、几LINE 4、每个LINE的data rate 是多少 ,单位是什么 5、图…...
多对多的增删改查
一 : 增 随机单号: /*** 文档就绪函数*/$(function () {//随机单号let number Math.floor(Math.random()*(9999-10001)1000);//取随机单号的值 固定格式输出$("#docNo").val(BSnumber);}) 开单日期: //处理开单日期$("#invoiceDate").val(new Date().to…...
vscode设置保存时自动缩进和格式化
参考博客 如何在 VSCode 中自动缩进你的代码 | Linux 中国 省流 使用 Ctrl Shift P 来打开命令模式,搜索 Open User Settings 并按下回车你需要搜索 Auto Indent,并在 “编辑器:自动缩进(Editor: Auto Indent)” 中选择 “全部(Full)”P…...
【练习】PAT 乙 1074 宇宙无敌加法器
题目 地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在PAT星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”。每个PAT星人都必须熟记各位数字的进制表,例如“……0527”就表示最…...
探店小程序:解锁商业新生态,定制未来
在数字化浪潮席卷全球的今天,商业的边界正在被重新定义。随着移动互联网技术的飞速发展,探店小程序作为一种新兴的商业模式,正以其独特的优势迅速成为连接商家与消费者的桥梁。我们刚刚为一家客户成功交付了一款集分销、分润、商业模式定制开…...
计算机视觉核心任务
1. 计算机视频重要分类 计算机视觉的重要任务可以大致分为以下几类: 1. 图像分类(Image Classification) 识别图像属于哪个类别,例如猫、狗、汽车等。 应用场景:物品识别、人脸识别、医疗影像分类。代表模型&#…...
【人工智能】如何在VSCode中使用DeepSeek?
文章目录 前言一、准备工作二、安装DeepSeek插件步骤1、扩展图标搜索DeepSeep2、安装DeepSeek插件3、使用测试DeepSeekBito文心一言 结论 前言 介绍在VSCode中调用DeepSeek插件工具,可以进行对话、编码。 一、准备工作 确保已经安装好了VSCode软件。 二、安装D…...
机器学习 - 进一步理解最大似然估计和高斯分布的关系
一、高斯分布得到的是一个概率吗? 高斯分布(也称为正态分布)描述的是随机变量在某范围内取值的概率分布情况。其概率密度函数(PDF)为: 其中,μ 是均值,σ 是标准差。 需要注意的是…...
Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!
在现代职场中,Office办公套件已成为工作和学习的必备工具,其功能强大但复杂,熟练掌握需要系统的学习。为了简化操作,使每个人都能轻松使用各种功能,市场上涌现出各类办公插件。这些插件不仅提升了用户体验,…...
如何在Android Studio中开发一个简单的Android应用?
Android Studio是开发Android应用的官方集成开发环境(IDE),它提供了许多强大的功能,使得开发者能够高效地创建Android应用。如果你是Android开发的初学者,本文将引导你如何在Android Studio中开发一个简单的Android应用…...
第40天:Web开发-JS应用VueJS框架Vite构建启动打包渲染XSS源码泄露代码审计
#知识点 1、安全开发-VueJS-搭建启动&打包安全 2、安全开发-VueJS-源码泄漏&代码审计 一、Vue搭建创建项目启动项目 1、Vue 框架搭建->基于nodejs搭建,安装nodejs即可 参考:https://cn.vuejs.org/ 已安装18.3或更高版本的Node.js 2、Vue 创建…...
996引擎-问题处理:三职业改单职业
996引擎-问题处理:三职业改单职业 问题解决方案顺便补充点单性别设置补充:可视化配置表参考资料问题 目前的版本: 引擎版本号:2024.8.7.0 三端配套客户端:3.40.9 传统PC客户端:23.12.07 配套数据库:64_24.8.7.0此版本需要通过可视化配置表...
Lua语言的云计算
Lua语言在云计算中的应用 随着信息技术的迅猛发展,云计算已经成为现代计算的重要组成部分。云计算通过互联网将计算资源(如服务器、存储、数据库、网络等)进行动态调配和高效利用,极大地提高了资源利用率与开发效率。在众多编程语…...
[数据结构] Set的使用与注意事项
目录 Set的说明 常见方法说明 注意事项 TreeSet使用案例 Set的说明 Set与Map主要的不同有两点: Set是继承自Collection的接口类,Set中只存储了Key. 常见方法说明 方法解释boolean add(E e)添加元素,但重复元素不会被添加成功void clear()清空集合boolean contains(Object…...
安当SLA操作系统登录双因素认证:全方位保障Windows系统登录安全
一、产品概述 在当今数字化时代,Windows系统面临着诸多安全挑战,如弱口令问题等。安当SLA(System Login Agent)作为一款强大的双因素登录认证产品,通过支持OTP动态口令和USBKey硬件令牌认证,有效解决多种W…...
Java学习进阶路线
Java基础 Java Web 前端HTML/css/js,J2EE(Servlet/jsp),数据库(Mysql/oracle) Java开发框架 Spring MVC/Mybatis/Herbernate/maven 《Java编程思想》 深入了解java基础 Java设计模式 《Effective j…...
操作系统|ARM和X86的区别,存储,指令集
文章目录 主频寄存器寄存器在硬件中的体现是什么寄存器的基本特性硬件实现寄存器类型 内存和寄存器的区别内存(Memory)和磁盘(Disk)指令的执行ARM Cortex-M3与Thumb-2指令集Thumb-2 与流水线虚拟地址指令的执行 多核CPU芯片间的通…...
Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)
背景 家人有一台夏新多功能 视频播放器(夏新多功能 视频播放器),用来播放广场舞。下载了一些广场舞视频, 只有部分视频可以播放,其他视频均无法播放,判断应该不是帧速率和数据速率的限制, 分析可能是播放器不支持帧高度大于720的视频。由于视频文件较多,需要借助视频编…...
日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(2):どれ・どの・どんな :区别 等
日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(2):どれ・どの・どんな :区别 等 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)知识点な形容詞(けいようし) と い形容詞(けいようし):并列修饰(2)知识点どれ・どの・どんな :区别(3)知识点は &…...
【浏览器多开】Google Chrome 谷歌浏览器分身术
谷歌浏览器分身术(多开): 复制已有谷歌浏览器图标—>右键–>属性的目标栏中,添加 --user-data-dir自定义文件夹路径 参数。 例如: C:\MySpace\02Installed\Chrome\Chrome-bin\99.0.4844.51\chrome.exe –user-d…...
《LeetCode Hot100》 Day01
Day01 轮转数组 思路: (1) 使用O(1) 空间复杂度解决,就需要原地解决,不能创建新的数组。 (2) 先整体反转数组,再反转前k个数,再反转剩下的数。即可完整本题。 &…...
【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现
医院在为患者进行诊断和治疗过程中,会产生大量的医学影像图片,如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存,需要将每个患者文件夹下的图片合并成…...
uniapp实现人脸识别(不使用三方插件)
uniapp实现人脸识别 内容简介功能实现上传身份证进行人脸比对 遇到的问题 内容简介 1.拍摄/相册将身份证照片上传到接口进行图片解析 2.使用live-pusher组件拍摄人脸照片,上传接口与身份证人脸进行比对 功能实现 上传身份证 先看下效果 点击按钮调用chooseImage…...
2025全新JSP简约博客平台-免费开源
前言 最近收到不少同学期末作业的需求,都还是JSP的老技术,介于现在很多网上可以找到的JSP现有项目,要么就是很老好几年前的,要么就是搞了一通不仅乱码还各自报错失败的,总之就是资源有限,于是我花了一星期…...
计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)
计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…...
基于SpringBoot的“4S店车辆管理系统”的设计与实现(源码+数据库+文档+PPT)_2025-02-10
基于SpringBoot的“4S店车辆管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统登录界面图 管理员功能界…...
ESP-IDF学习记录(6)
这篇不知道起什么标题,因为已经卡滞很久了,从年前到现在,但也没停止探索 1.烧录 用的小型加热台,这步对我来说最难,自己没有焊接过QFN32的封装 总结一下目前遇到的问题: 1)5V供电选成了12V转…...
Day84:数据可视化
数据可视化是数据分析的重要组成部分,它能直观地展现数据规律,使复杂数据变得易懂。Python 提供了多个数据可视化库,其中最常用的是 Matplotlib 和 Seaborn。今天,我们将学习如何使用这些工具绘制折线图、柱状图、散点图等。 1. 安装和导入库 如果你的 Python 没有安装 Ma…...
【机器学习与数据挖掘实战】案例13:基于BP神经网络模型的家用热水器用户行为分析与事件识别
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数…...
