Qt/C++ 调用迅雷开放下载引擎(ThunderOpenSDK)下载数据资源

目录导读

    • 前言
    • ThunderOpenSDK 简介
      • 参考 xiaomi_Thunder_Cloud 示例
      • ThunderOpenSDK 下载问题

前言

在对以前老版本的exe执行程序进行研究学习的时候,发现以前的软件是使用的ThunderOpenSDK这个迅雷开放下载引擎进行的项目数据下载,于是在网上搜索一番找到了相关内容,但是不知道为什么了相关资料相当少,不过用是真的好用,于是仔细的研究了一下。


ThunderOpenSDK 简介

ThunderOpenSDK 是一个迅雷开放下载引擎的 SDK,允许开发者在自己的应用程序中集成迅雷的下载功能。该 SDK 提供了丰富的接口,支持多种下载任务的管理,包括任务的创建、启动、停止、删除等操作。此外,SDK 还支持设置下载速度限制、代理、用户代理等功能,以满足不同应用场景的需求。
出自:ThunderOpenSDK 使用教程
相关内容参考:

  1. 迅雷开放下载引擎(ThunderOpenSDK)使用指南

  2. ThunderOpenSDK 使用教程

  3. 配置云平台ip和端口 云平台接口

  4. GitHub: ThunderOpenSDK

ThunderOpenSDK 不需要再进行编译,直接附加到项目中就能直接使用,甚至示例程序都写好了,只管调用。
GitHub示例中有0.CurUseCommonLib360Jisu_Thunder_Cloudliebao_Thunder_Cloudxiaomi_Thunder_CloudXunleiDownload_Old 5个版本的示例,
可以根据需求任选一个
在这里插入图片描述
通过查看xldl.dll文件的属性信息和Github上的声明,
我都毫不怀疑这些库文件是不是是从某个软件上扒下来的。

参考 xiaomi_Thunder_Cloud 示例

xiaomi_Thunder_Cloud 迅雷云加速开发平台版本示例;
在这里插入图片描述
打开xldl.h文件可以发现xldl.dll的接口和数据结构都已经声明好还有注释,只管调用:

  • xldl.h:
#pragma once// 所有结构体定义按1字节对齐
#pragma pack(push, 1)
struct DownTaskParam
{DownTaskParam(){memset(this, 0, sizeof(DownTaskParam));nReserved1		 = 5;bReserved			 = FALSE;DisableAutoRename	 = FALSE;IsOnlyOriginal		 = FALSE;IsResume			 = TRUE;}int nReserved;wchar_t szTaskUrl[2084];          // 任务URLwchar_t szRefUrl[2084];           // 引用页wchar_t szCookies[4096];          // 浏览器cookiewchar_t szFilename[MAX_PATH];     // 下载保存文件名.wchar_t szReserved0[MAX_PATH];wchar_t szSavePath[MAX_PATH];     // 文件保存目录HWND  hReserved;BOOL bReserved; wchar_t szReserved1[64];wchar_t szReserved2[64];BOOL IsOnlyOriginal;            // 是否只从原始地址下载UINT nReserved1;BOOL DisableAutoRename;         // 禁止智能命名BOOL IsResume;                  // 是否用续传DWORD reserved[2048];
};
enum  DOWN_TASK_STATUS
{NOITEM = 0,TSC_ERROR,TSC_PAUSE,TSC_DOWNLOAD,TSC_COMPLETE,TSC_STARTPENDING,TSC_STOPPENDING
};
enum TASK_ERROR_TYPE
{TASK_ERROR_UNKNOWN	   =			0x00,   // 未知错误TASK_ERROR_DISK_CREATE =			0x01,   // 创建文件失败TASK_ERROR_DISK_WRITE =				0x02,   // 写文件失败TASK_ERROR_DISK_READ =				0x03,   // 读文件失败TASK_ERROR_DISK_RENAME =			0x04,   // 重命名失败TASK_ERROR_DISK_PIECEHASH =			0x05,   // 文件片校验失败TASK_ERROR_DISK_FILEHASH =			0x06,   // 文件全文校验失败TASK_ERROR_DISK_DELETE =			0x07,   // 删除文件失败失败TASK_ERROR_DOWN_INVALID =			0x10,   // 无效的DOWN地址TASK_ERROR_PROXY_AUTH_TYPE_UNKOWN = 0x20,   // 代理类型未知TASK_ERROR_PROXY_AUTH_TYPE_FAILED = 0x21,   // 代理认证失败TASK_ERROR_HTTPMGR_NOT_IP =			0x30,   // http下载中无ip可用TASK_ERROR_TIMEOUT =				0x40,   // 任务超时TASK_ERROR_CANCEL =					0x41,   // 任务取消TASK_ERROR_TP_CRASHED=              0x42,   // MINITP崩溃TASK_ERROR_ID_INVALID =             0x43,   // TaskId 非法
};
struct DownTaskInfo
{DownTaskInfo(){memset(this, 0, sizeof(DownTaskInfo));stat		= TSC_PAUSE;fail_code	= TASK_ERROR_UNKNOWN;fPercent = 0;bIsOriginUsable = false;fHashPercent = 0;}DOWN_TASK_STATUS	stat;TASK_ERROR_TYPE		fail_code;wchar_t		szFilename[MAX_PATH];wchar_t		szReserved0[MAX_PATH];__int64     nTotalSize;         // 该任务总大小(字节)__int64     nTotalDownload;     // 下载有效字节数(可能存在回退的情况)float		fPercent;           // 下载进度int			nReserved0;int			nSrcTotal;          // 总资源数int			nSrcUsing;          // 可用资源数int			nReserved1;int			nReserved2;int			nReserved3;int			nReserved4;__int64     nReserved5;__int64		nDonationP2P;       // p2p贡献字节数__int64		nReserved6;__int64		nDonationOrgin;		// 原始资源共享字节数__int64		nDonationP2S;		// 镜像资源共享字节数__int64		nReserved7;__int64     nReserved8;int			nSpeed;             // 即时速度(字节/秒)int			nSpeedP2S;          // 即时速度(字节/秒)int			nSpeedP2P;          // 即时速度(字节/秒)bool		bIsOriginUsable;    // 原始资源是否有效float		fHashPercent;       // 现不提供该值int			IsCreatingFile;     // 是否正在创建文件DWORD		reserved[64];
};
enum DOWN_PROXY_TYPE
{PROXY_TYPE_IE	 = 0,PROXY_TYPE_HTTP  = 1,PROXY_TYPE_SOCK4 = 2,PROXY_TYPE_SOCK5 = 3,PROXY_TYPE_FTP   = 4,PROXY_TYPE_UNKOWN  = 255,
};
enum DOWN_PROXY_AUTH_TYPE
{PROXY_AUTH_NONE =0,PROXY_AUTH_AUTO,PROXY_AUTH_BASE64,PROXY_AUTH_NTLM,PROXY_AUTH_DEGEST,PROXY_AUTH_UNKOWN,
};
struct DOWN_PROXY_INFO
{BOOL		bIEProxy;BOOL		bProxy;DOWN_PROXY_TYPE	stPType;DOWN_PROXY_AUTH_TYPE	stAType;wchar_t		szHost[2048];INT32		nPort;wchar_t		szUser[50];wchar_t		szPwd[50];wchar_t		szDomain[2048];
};
struct WSAPROTOCOL_INFOW;#pragma pack(pop)namespace DownEngine
{extern "C" __declspec(dllimport) BOOL   XL_Init(void);extern "C" __declspec(dllimport) BOOL   XL_UnInit(void);extern "C" __declspec(dllimport) HANDLE XL_CreateTask(DownTaskParam &stParam);extern "C" __declspec(dllimport) BOOL   XL_DeleteTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL   XL_StartTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL   XL_StopTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL   XL_ForceStopTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL   XL_QueryTaskInfo(HANDLE hTask, DownTaskInfo & stTaskInfo); //旧版接口,使用Ex接口替换extern "C" __declspec(dllimport) BOOL   XL_QueryTaskInfoEx(HANDLE hTask, DownTaskInfo & stTaskInfo);extern "C" __declspec(dllimport) BOOL	XL_DelTempFile(DownTaskParam &stParam);extern "C" __declspec(dllimport) void	XL_SetSpeedLimit(INT32 nKBps);extern "C" __declspec(dllimport) void	XL_SetUploadSpeedLimit(INT32 nTcpKBps,INT32 nOtherKBps);extern "C" __declspec(dllimport) BOOL	XL_SetProxy(DOWN_PROXY_INFO &stProxyInfo);extern "C" __declspec(dllimport) void   XL_SetUserAgent(const wchar_t *pszUserAgent);extern "C" __declspec(dllimport) BOOL   XL_ParseThunderPrivateUrl(const wchar_t *pszThunderUrl, wchar_t *normalUrlBuffer, INT32 bufferLen);extern "C" __declspec(dllimport) BOOL   XL_GetFileSizeWithUrl(const wchar_t * lpURL, INT64& iFileSize);extern "C" __declspec(dllimport) BOOL   XL_SetFileIdAndSize(HANDLE hTask, char szFileId[40], unsigned __int64 nFileSize);extern "C" __declspec(dllimport) BOOL   XL_SetAdditionInfo( HANDLE task_id, WSAPROTOCOL_INFOW *sock_info, CHAR *http_resp_buf, LONG buf_len );extern "C" __declspec(dllimport) HANDLE XL_CreateTaskByURL(const wchar_t *url, const wchar_t *path, const wchar_t *fileName, BOOL IsResume);extern "C" __declspec(dllimport) LONG   XL_CreateTaskByThunder(wchar_t *pszUrl, wchar_t *pszFileName, wchar_t *pszReferUrl, wchar_t *pszCharSet, wchar_t *pszCookie);extern "C" __declspec(dllimport) LONG   XL_CreateBTTaskByThunder(const wchar_t *pszPath);
};

相关函数的具体说明,可以参考Github上的文档
这一版本没有调用的示例,但是没关系,liebao_Thunder_Cloud这一版本有调用示例;
在这里插入图片描述
参考thunderWrapper.h文件中的thunderWrapper类通过
LoadLibraryGetProcAddress函数调用,使用MSCV2017编译器
并添加<Windows.h>引用,建议添加:

#include <Windows.h>
#include <stdio.h>
#include <Shlwapi.h>
#pragma comment(lib,"Shlwapi")
  • 初始化函数示例:

只需要简单修改init方法,修改xldl.dll的加载路径,其他基本不变;

bool init(PCWSTR pDllPath = L"xldl.dll")
{assert(!m_hModule);WCHAR szModulePath[MAX_PATH] = { 0 };GetModuleFileNameW(NULL, szModulePath, MAX_PATH);PathRemoveFileSpecW(szModulePath);  // 拆分路径        新版使用PathCchRemoveFileSpecqDebug()<<"[szModulePath] "<<QString::fromWCharArray(szModulePath);WCHAR szDllpath[MAX_PATH] = { 0 };PathCombineW(szDllpath, szModulePath, L"xldl.dll");  // 连接路径, 新版建议使用 PathCchCombineqDebug()<<"[szDllpath] "<<QString::fromWCharArray(szDllpath);m_hModule = LoadLibraryW(szDllpath);assert(m_hModule);if (m_hModule == NULL){qDebug()<<"can not load xldl.dll -->";throw L"can not load xldl.dll";}_Init					= (fn_Init)						GetProcAddress(m_hModule, "XL_Init");_UnInit					= (fn_UnInit)					GetProcAddress(m_hModule, "XL_UnInit");_TaskCreate				= (fn_TaskCreate)				GetProcAddress(m_hModule, "XL_CreateTask");_TaskDelete				= (fn_TaskDelete)				GetProcAddress(m_hModule, "XL_DeleteTask");_TaskStart				= (fn_TaskStart)				GetProcAddress(m_hModule, "XL_StartTask");_TaskPause				= (fn_StopTask)				    GetProcAddress(m_hModule, "XL_StopTask");_TaskForcePause         = (fn_StopTask)				    GetProcAddress(m_hModule, "XL_ForceStopTask");_TaskQuery				= (fn_TaskQuery)				GetProcAddress(m_hModule, "XL_QueryTaskInfo");_TaskQueryEx			= (fn_TaskQueryEx)				GetProcAddress(m_hModule, "XL_QueryTaskInfoEx");_LimitSpeed				= (fn_LimitSpeed)				GetProcAddress(m_hModule, "XL_SetSpeedLimit");_LimitUploadSpeed		= (fn_LimitUploadSpeed)			GetProcAddress(m_hModule, "XL_SetUploadSpeedLimit");_DelTempFile			= (fn_DelTempFile)				GetProcAddress(m_hModule, "XL_DelTempFile");_SetProxy				= (fn_SetProxy)                 GetProcAddress(m_hModule, "XL_SetProxy");_SetUserAgent			= (fn_SetUserAgent)				GetProcAddress(m_hModule, "XL_SetUserAgent");_GetFileSizeWithUrl		= (fn_GetFileSizeWithUrl)		GetProcAddress(m_hModule, "XL_GetFileSizeWithUrl");_ParseThunderPrivateUrl = (fn_ParseThunderPrivateUrl)	GetProcAddress(m_hModule, "XL_ParseThunderPrivateUrl");_SetAdditionInfo		= (fn_SetAdditionInfo)			GetProcAddress(m_hModule, "XL_SetAdditionInfo");_SetFileIdAndSize		= (fn_SetFileIdAndSize)			GetProcAddress(m_hModule, "XL_SetFileIdAndSize");_CreateTaskByURL        = (fn_CreateTaskByURL)			GetProcAddress(m_hModule, "XL_CreateTaskByURL");_CreateTaskByThunder    = (fn_CreateTaskByThunder)		GetProcAddress(m_hModule, "XL_CreateTaskByThunder");_CreateBTTaskByThunder  = (fn_CreateBTTaskByThunder)	GetProcAddress(m_hModule, "XL_CreateBTTaskByThunder");CHECKFUNC(_Init, false);return _Init() == TRUE;
}

需要注意的是在不同版本中,所包含的方法函数也不一样,例如liebao_Thunder_Cloud 版就没有XL_CreateTaskByURL函数方法,

  • 实际线程调用:

继承QThread类,重写void run() override;方法,获取文件总大小,下载进度,下载有效字节数,即时速度,倒计时等信息,并通过信号槽控制下载的中断和退出。

void QThread_ThunderWrapper::run()
{emit IsStart(true);bool ISuccessed=false;IsQuit=false;QString Error="";try {qDebug()<<"QThread_ThunderWrapper Start!";thunderWrapper=new Lib_ThunderWrapper();bool ISuccessed=thunderWrapper->init();if(!ISuccessed)throw QString("Lib_ThunderWrapper 初始化失败!");elseqDebug()<<"thunderWrapper->init : Successed!";wchar_t * url=utf8_to_wchar(Urlpath.toStdString().c_str());wchar_t * path=utf8_to_wchar(Filepath.toStdString().c_str());wchar_t * fileName=utf8_to_wchar(Filename.toStdString().c_str());if(!thunderWrapper->CreateTaskByURL(url,path,fileName,TRUE)){thunderWrapper->unInit();throw QString("taskCreate 失败!");}elseqDebug()<<"thunderWrapper->taskCreate : Successed!";if(!thunderWrapper->taskStart()){thunderWrapper->taskDelete();thunderWrapper->unInit();throw QString("taskStart 失败!");}elseqDebug()<<"thunderWrapper->taskStart : Successed!";//! 1秒查询一次msleep(1000);DownTaskInfo stTaskInfo;while (!IsQuit) {if(thunderWrapper->taskQueryEx(stTaskInfo)){if(stTaskInfo.stat==TSC_ERROR){emit Current_status("下载失败!",TSC_ERROR);throw QString("TSC_ERROR: fail_code:%1").arg(stTaskInfo.fail_code);}else if(stTaskInfo.stat==TSC_PAUSE){emit Current_status("下载暂停!",TSC_PAUSE);}else if(stTaskInfo.stat==TSC_DOWNLOAD){emit Current_status("正在下载...",TSC_PAUSE);emit Down_Speed(stTaskInfo.nSpeed);emit ProgressBar((int)stTaskInfo.fPercent*100);emit SendDownsize(stTaskInfo.nTotalDownload,stTaskInfo.nTotalSize);if(stTaskInfo.nSpeed>0)emit Time_Remaining((stTaskInfo.nTotalSize-stTaskInfo.nTotalDownload)/stTaskInfo.nSpeed);}else if(stTaskInfo.stat==TSC_COMPLETE){ISuccessed=true;IsQuit=true;emit Current_status("下载完成",TSC_COMPLETE);emit Down_Speed(stTaskInfo.nSpeed);emit ProgressBar((int)stTaskInfo.fPercent*100);emit SendDownsize(stTaskInfo.nTotalDownload,stTaskInfo.nTotalSize);emit Time_Remaining(0);break;}else if(stTaskInfo.stat==TSC_STARTPENDING){emit Current_status("等待下载!",TSC_STARTPENDING);}else if(stTaskInfo.stat==TSC_STOPPENDING){emit Current_status("停止等待!",TSC_STARTPENDING);}
//                qDebug().noquote()<<QString("\n state              : %1 "
//                                            "\n fail_code          : %2"
//                                            "\n nTotalSize         : %3"
//                                            "\n nTotalDownload     : %4"
//                                            "\n fPercent           : %5"
//                                            "\n nSrcTotal          : %6"
//                                            "\n nSrcUsing          : %7"
//                                            "\n nSpeed             : %8"
//                                            "\n szFilename         : %9"
//                                            "\n szSavePath         : %10"
//                                            "\n IsCreatingFile     : %11"
//                                            "\n bIsOriginUsable    : %12 \n\n")
//                                     .arg(stateStr)
//                                     .arg(stTaskInfo.fail_code)
//                                     .arg(QString::number(stTaskInfo.nTotalSize,10))
//                                     .arg(QString::number(stTaskInfo.nTotalDownload,10))
//                                     .arg(QString::number(stTaskInfo.fPercent))
//                                     .arg(stTaskInfo.nSrcTotal)
//                                     .arg(stTaskInfo.nSrcUsing)
//                                     .arg(stTaskInfo.nSpeed)
//                                     .arg(QString::fromWCharArray(stTaskInfo.szFilename))
//                                     .arg(QString::fromWCharArray(stTaskInfo.szReserved0))
//                                     .arg(stTaskInfo.IsCreatingFile?"TRUE":"FALSE")
//                                     .arg(stTaskInfo.bIsOriginUsable?"TRUE":"FALSE")
//                                    ;//! 1秒查询一次}msleep(1000);}}catch (QString error) {ISuccessed=false;Error="异常信息 :"+error;}catch (...) {}qDebug()<<"thunderWrapper unInit-->";thunderWrapper->unInit();//! 清除连接delete thunderWrapper;thunderWrapper=nullptr;emit IsStart(true);
}

如图所示:
下载在网上找到系统镜像文件时,ThunderOpenSDK下载速度更快, 能稳定到9mb/s左右,而通过原生的QNetworkReply下载最高在5Mb/s左右。
请添加图片描述


ThunderOpenSDK 下载问题

ThunderOpenSDK 无法下载包含重定向跳转的下载链接,
正当我打算整体改用ThunderOpenSDK下载时,我突然发现ThunderOpenSDK 无法下载项目中的资源文件,换成其他网上找的资源文件又能正常下载,
测试多次发现ThunderOpenSDK只能下载直接指向下载资源的链接,
包含重定向跳转的下载链接下载不了!
无解,果断放弃,还是改用调用Aria2下载!
不过一般的下载ThunderOpenSDK库也完全够用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter Row组件实战案例

In this section, we’ll continue our exploration by combining the Row and Container widgets to create more complex layouts. Let’s dive in! 在本节中&#xff0c;我们将继续探索&#xff0c;结合“Row”和“Container”小部件来创建更复杂的布局。让我们开始吧! Sc…

已解决Navicat 选择Mysql表 报错unkonow internal error: Access violation - no RTTI data

已解决Navicat 选择Mysql表 报错unkonow internal error&#xff1a; Access violation - no RTTI data 报错信息截图&#xff1a; 使用Navicat Premium15 选择sql server表时 出现大量弹窗报错&#xff0c;导致sql文件执行不了&#xff0c;右键数据库执行外部文件也失败了。弹…

Python日志系统详解:Logging模块最佳实践

Python日志系统详解&#xff1a;Logging模块最佳实践 在开发Python应用程序时&#xff0c;日志记录是排查问题、监控系统状态、优化性能的重要手段。Python标准库中提供了强大的logging模块&#xff0c;使开发者可以轻松实现灵活的日志系统。本文将详细介绍Python的logging模块…

Kubernetes:(二)K8Sv1.20二进制部署

文章目录 一、k8s项目架构二、二进制搭建 Kubernetes v1.20 &#xff08;单master节点&#xff09;1.操作系统初始化配置2.部署 docker引擎3. etcd的概念4. 证书认证5. node01 节点操作&#xff08;192.168.44.10&#xff09;6. node02 节点操作&#xff08;192.168.44.40&…

arcgis pro 3.3.1安装教程

一、获取方式&#xff1a; http://dt4.8tupian.net/2/29913a61b1500.pg3二、软件目录&#xff1a; 三、安装步骤&#xff1a; &#xff08;1&#xff09;安装软件运行环境windowsdesktop-runtime 8.0.4; &#xff08;2&#xff09;选中安装文件arcgispro_33zh_cn_190127.exe&…

nfs作业

服务机 配置文件内容 客户机

QT实时显示日志内容

性能有待提高&#xff1b; 能够读取指定目录下的日志文件&#xff0c;显示在下拉框中。 选择某一个日志之后&#xff0c;点击获取数据按钮&#xff0c;能够实时刷新日志内容。 但是每次刷新都会对整个文件进行读取&#xff0c;文本框重新加载文本。效率很低&#xff0c;影响性能…

基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的布匹缺陷检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的布匹缺陷检测系统是在 PyTo…

着色器的认识

知识了解&#xff1a; 着色器&#xff1a; 顶点着色器: 用来描述顶点的特性,如位置、颜色等&#xff0c;其中&#xff0c;顶点&#xff1a;是指二维或三维空间中的一个点比如交点或者端点。 片元着色器&#xff1a;用来进行逐片元处理操作&#xff0c;比如光照、颜色叠加等&…

从零搭建开源陪诊系统:关键技术栈与架构设计

构建一个开源陪诊系统是一个涉及多种技术的复杂工程。为了让这个系统具备高效、可靠和可扩展的特点&#xff0c;我们需要从架构设计、技术栈选择到代码实现等方面进行全面的考量。本文将从零开始&#xff0c;详细介绍搭建开源陪诊系统的关键技术栈和架构设计&#xff0c;并提供…

react-signature-canvas 实现画笔与橡皮擦功能

react-signature-canvas git 地址 代码示例 import React, { Component } from react import { createRoot } from react-dom/clientimport SignaturePad from ../../src/index.tsximport * as styles from ./styles.module.cssclass App extends Component {state { trimmed…

Java知识巩固(十二)

I/O JavaIO流了解吗&#xff1f; IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因…

中间件安全(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞&#xff08;cve_2021_41773&#xff09;。 靶场链接&#xff1a;Vulfocus 漏洞威胁分析平台 一&#xff0c;漏洞简介。 cve_2021_41773漏洞…

工欲善其事必先利其器——Anaconda安装教程(2024版本)

前言 在数据科学、机器学习、科学计算等领域&#xff0c;Python 因其简洁的语法和强大的库支持而广受欢迎。Anaconda 是一个流行的Python发行版&#xff0c;它包含了大量的科学计算和数据分析库&#xff0c;极大地方便了开发者和研究者的工作。本文将为您提供2024版本的Anacon…

ctfshow(155->158)--文件上传漏洞--绕过黑名单

Web155 进入界面&#xff1a; 审计&#xff1a; 前端校验&#xff1a;限制传入文件的后缀为.png MIME验证 黑名单过滤 思路/EXP&#xff1a; 先上传.user.ini文件&#xff1a; 将.user.ini.png文件上传&#xff0c;然后抓包去掉.png后缀&#xff0c;就同时绕过了前端校验…

第7次CCF CSP认证真题解

1、折点计数 题目链接&#xff1a;https://sim.csp.thusaac.com/contest/7/problem/0 100分代码&#xff1a; #include <iostream> using namespace std; int main(int argc, char *argv[]) {int n;cin >> n;int a[1010];for(int i 0; i < n; i){cin >&g…

我谈Canny算子

在Canny算子的论文中&#xff0c;提出了好的边缘检测算子应满足三点&#xff1a;①检测错误率低——尽可能多地查找出图像中的实际边缘&#xff0c;边缘的误检率&#xff08;将边缘识别为非边缘&#xff09;低&#xff0c;且避免噪声产生虚假边缘&#xff08;将非边缘识别为边缘…

STM32-Cube定时器TIM

一、内部时钟源 1、创建项目 File → New → STM32 project选择STM32F103C8T6单片机&#xff0c;命名TIM 2、配置单片机 1.打开USART1&#xff0c;方便我们与电脑连接查看数据 开启UART1并开启中断。 2、设置时钟源 开启外部高速晶振 将时钟频率设置为72MHz 设置调试模…

三款计算服务器配置→如何选择科学计算服务器?

科学计算在众多领域都扮演着关键角色&#xff0c;无论是基础科学研究还是实际工程应用&#xff0c;强大的计算能力都是不可或缺的。而选择一台合适的科学计算服务器&#xff0c;对于确保科研和工作的顺利进行至关重要。 首先&#xff0c;明确自身需求是重中之重。要仔细考虑计算…

【SSM详细教程】-14-SpringAop超详细讲解

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…