国产压缩包工具——JlmPackCore SDK说明(二)——JlmPack_Create函数说明

一、JlmPack_Create函数说明

在这里插入图片描述
JlmPack_Create函数是创建jlm压缩文件的核心函数,最大允许CATALOG_MAX_LIMIT(请参考Config.h)个目录,意思是包括文件夹和文件在内,遍历整个列表最大允许CATALOG_MAX_LIMIT个目录对象,默认是10000个,如果有特殊情况可以调整到十万个或百万个,不建议太大。目录越多,前期遍历目录的时间就越长。库函数名:

JLMPACK_API int JlmPack_Create(VARIABLES* vars);

(1)JLMPACK_API宏定义
JLMPACK_API是宏定义,主要是根据linux和windows的库函数导出标识。在Config.h中有定义:

// Windows下
#define JLMPACK_API __declspec(dllexport)
// 非windows下
#define JLMPACK_API __attribute__ ((visibility ("default")))

目的是导出库函数,在调用该函数时,函数可见。

(2)输入参数说明
在库函数中的所有的输入参数均为VARIABLES* vars,VARIABLES为结构体是一个输入参数结构体,各函数复用,只是用的对象不相同。结构体说明如下:

/**************************************************************************************
VARIABLES变量传递,函数不同则对变量要求不同,请参考各函数的说明
***************************************************************************************/
typedef struct
{
	/**************************************************************************
	* 授权文件YESINE.license的路径,该路径必须正确而且证书也必须是正确有效才能使用本SDK中的所有函数
	**************************************************************************/
	unsigned char* licenseFilePath;
	/**************************************************************************
	* 总字节数totalBytes,和累计字节数Cumulative,主要用于进度条的计算
	**************************************************************************/
	unsigned long long totalBytes;
	unsigned long long cumulativeBytes;
	/**************************************************************************
	* jlmFile为JLM文件格式信息
	* jlmExtra为JLM文件扩展信息
	**************************************************************************/
	JLM_FILE* jlmFile;                              // 输入或输出jlm文件头信息,见结构体JLM_FILE
	JLM_EXTRA* jlmExtra;                            // 输入或输出jlm文件扩展信息,见结构体JLM_EXTRA
	/**************************************************************************
	* RandomBytes为编码前或译码后的随机数数组,随机数是抗量子破解的核心
	* RandomBytes_size为随机数数组中字节个数
	**************************************************************************/
	unsigned char* RandomBytes;                     // 输入或输出随机数,用于生成密钥
	int RandomBytes_size;                           // 输入或输出随机数的字节数
	/**************************************************************************
	* Passwords为编码或译码的密码数组,将根据用户的需要是否
	* Passwords_size为密码数组中字节个数,Passwords_size >= 0且Passwords_size < 64,不建议太长怕忘记后无法找回
	**************************************************************************/
	unsigned char* Passwords;                       // 输入加解密密码,译码时密码是解密的关键
	int Passwords_size;                             // 输入加解密密码长度
	/**************************************************************************
	* jlmFileUrl为编码后或解码前的jlm文件的路径和文件名,可以包括".jlm"
	* 支持XXX.jlm首包路径,也支持XXX_packX.jlm子包路径,任何这样的路径输入给jlmFileUrl均可定位到首包的路径
	**************************************************************************/
	unsigned char* jlmFileUrl;
	/**************************************************************************
	* pathList为编码前或解码后的各类文件和文件夹的路径列表,pathList中允许.jlm文件
	* pathListSize为pathList中路径的个数
	* 注意:编码时pathList为各类文件和文件夹的路径,所以pathListSize大于等于
	* 译码时pathList只能是译码后的文件夹路径,且pathListSize只能等于1
	**************************************************************************/
	unsigned char** pathList;                          // 待编码文件的路径列表或译码后存放文件的文件夹路径,pathList[i]代表一个路径
	int pathListSize;                               // pathList中路径个数
	/**************************************************************************
	* 签名的数字证书哈希值(数据指纹),用于计算JLM_FILE.cer
	**************************************************************************/
	unsigned char* license;                       // 签名的数字证书哈希值(数据指纹),用于计算JLM_FILE.license
	int license_size;                             // 签名的数字证书哈希值字节长度,fatherCer_size为0时说明无签名,此时JLM_FILE.cer为全0序列
	/**************************************************************************
	* rule为目录权限规则,用于管理目录打开条件,请参考SDK说明书
	**************************************************************************/
	short rule;                                     // 权限编号
	/**************************************************************************
	* IdList为待处理的ID列表,比如删除某些ID、追加文件到某个ID下、译码某些ID对应的文件夹或文件等
	* IdList_Size为IdList中ID的个数
	**************************************************************************/
	int* IdList;                                    // ID列表,主要用于译码、删除和增加,创建JLM文件时IdList无效
	int IdList_Size;                                // IdList中ID的个数
	/**************************************************************************
	* 临时运算变量,重复使用
	**************************************************************************/
	unsigned char* InByteArray;                     // 用于压缩和加密编码的临时输入,包括了文件复制等等
	unsigned int InByteArray_Size;
	unsigned char* OutByteArray;                    // 用于解压和解密译码的临时输出,包括了文件复制等等
	unsigned int OutByteArray_Size;
	unsigned char* WriteOrReadBuff;                 // 用于写文件,大小和OutByteArray、InByteArray一致
	unsigned int WriteOrReadBuff_Size;
	/**************************************************************************
	* 日志输入信息
	**************************************************************************/
	JLM_LOG* log;                                   // 日志文件

}VARIABLES;

在JlmPack_Create函数中主要用到如下几个参数:
a、unsigned char* licenseFilePath; 为商业授权证书的路径,由上层软件自行指定存放位置,允许存放在服务器上实时下载,商业证书的大小一般在2KB以下。
b、unsigned long long totalBytes;和unsigned long long cumulativeBytes; 这两个参数需要配合使用,为进度条提供计算参数,方便异步更新进度条,totalBytes为当前需要编码的总字节数,cumulativeBytes为累计已经编码的字节数。
c、JLM_FILE* jlmFile; 是jlm压缩包文件的核心结构体,部分参数需要外部提供和设置,比如结构体中的packBytesLengthencryptionWindow两个参数是可以自定义的,packBytesLength表示将jlm文件按照packBytesLength切割成独立的文件卷,在rar中表示“卷”的大小,允许设定50MB-3.96GB的任何整数,受Config.h文件中的#define JLMPACK_BYTES_LIMIT 4227858432ULL限制,而且分割的“卷”不能太小,受到#define MAX_NUMBER_PACKS 100的约束。encryptionWindow参数是杰林码解密算法轮函数窗口大小,即按照这个大小,编码encryptionWindow个字节后,需要重新初始化或生成随机数编码后续的数据,目的是提高安全性,但是如果encryptionWindow太小,更新过快,会影响编译码效率。
d、JLM_EXTRA* jlmExtra ; 自定义定义的版权信息,在JlmPack_Create函数属于输入参数,可以为空,比如利用jlmpack封装mp4或mp3等音视频文件时可以附加版权归属信息或歌词等信息,主要是方便进行版权管控,所有权人可以通过我们的服务端,或自行开发的服务端对版权所属文件进行管控,比如禁止播放,禁止解码,限制播放或限制解码等等功能。
e、unsigned char* RandomBytes;和int RandomBytes_size; 这两个参数是成对使用的,是杰林码随机加解密的核心,只需要提供缓存指针和缓存大小,开辟后请在外部释放。JlmPack_Create分别针对目录信息和每个文件独立随机加密,随机加密使得相同的密码和明文下得到的密文不相同,大大增加了破解的难度。
f、unsigned char* Passwords;和int Passwords_size; 这两个参数是成对使用的,是杰林码随机加解密的核心,加解密的密码,可以中文、自定义长度,密码会在杰林码算法中生成512为的密钥。请牢记自己的密码,我们无法提供解密服务!
g、unsigned char* jlmFileUrl; 压缩加密后jlm文件存放位置,这个绝对不能为空,比如D:\test.jlm。如果设定的“卷”的大小,则会在D:\下自动生成test_packX.jlm(其中X代表1,2,3…)各个卷。如果D:\test.jlm已经存在,则自动更改名字为D:\test(1).jlm或D:\test(1)(1).jlm等等。
h、unsigned char** pathList和int pathListSize; 这两个参数是成对使用的,属于待编码的文件或文件夹的列表,pathListSize不能为0,pathList不能为空。比如我们有可能选择文件夹或文件,这些需要列出一个列表,本函数会自动遍历文件夹下的所有文件夹和文件,并生成目录对象
i、unsigned char* license;和int license_size; 这两个参数是成对使用的,是商业授权证书的数字指纹缓存地址,可以为空,如果存在商业授权证书,则目录对象将采用商业证书的数字指纹进行签名,并且该签名后的文件可以保存到服务端,配合JLM_LOG结构体中的consistencyMark实现文件的管控和追踪。license需要通过jlmpack官网根证书签名,实名认证和实时校验,允许license签名子证书,需要在官网后台完成。
j、short rule; 权限编号,比如允许解压,必须联网检验,必须上报日志文件等等0-65536个权限编号。比如:

/**************************************************************************
	* rule为目录权限规则,用于管理目录打开条件
	* 0-99:无需后台管控,比如0无限制,1-999可以根据实际需求做功能限制,比如1为只读模式(禁止增、删和改),下面的按照此类推
	* 1000-1999的组合如下:
	* 1000-1099:必须上传跟踪信息,包括了解码的设备信息、账户信息、目录查看时间和解码了哪些文件等,1001表示必须上传跟踪信息且只读模式
	* 1100-1199:必须上传跟踪信息且强制账号白名单校验,如果解码的账号不在白名单内禁止文件解密,目录可以查看,无网络或非法解密3次自毁文件
	* 1200-1299:必须上传跟踪信息且强制账号和设备白名单校验,账号和设备不在白名单内禁止文件解密,目录可以查看,无网络或非法解密3次自毁文件
	* 1300-1399:必须上传跟踪信息且强制账号、设备和解码的限制日期时间校验,账号和设备不在白名单内且解码超过限制日期时间,无网络、非法解密3次或超时自毁文件
	* 2000-2999:属于灾备权限,即当前的文件可以上传到服务器端进行灾难备份,本地的文件需要强制与灾备哈希值进行校验,防止勒索病毒侵袭
	* 其他的根据实际情况再定义
	**************************************************************************/

需要注意的是,该编号默认是随机加密状态,不可能被黑客找到位置去修改!!,所以请保管好自己的密码。
k、unsigned char* InByteArray;unsigned int InByteArray_Size;unsigned char* OutByteArray;unsigned int OutByteArray_Size;unsigned char* WriteOrReadBuff;unsigned int WriteOrReadBuff_Size; 这六个参数是运算缓存,请开辟大小为#define BINARY_FILE_MAX_LIMIT 10485760,该值可以通过Config.h调整,注意释放
l、JLM_LOG* log; 这个参数纯粹的返回参数,即根据JLM_LOG返回对应的信息,这些信息在jlm pack软件中会上报到服务系统中,方便后台进行管控和跟踪,JLM_LOG结构体是可扩展和自定义的比如增加用户名,MAC地址,IP地址等等。
(3)返回int参数
返回0表示无错,大于0则表示存在错误,请查看SDK中的错误编号说明(Error number specification).txt文件检查,注意SDK中的错误不会上报到jlmpack的官网,大家通过官网留言。

二、JlmPack_Create函数用法

我们可以打开main.c里面的int Create()就是案例,其中为了考虑到linux和windows注意程序中的用法和开辟的内存大小。

int Create() { // 4
	// 设置为""的目的是跟随系统,支持windows和linux
	setlocale(LC_ALL, ""); // en_US.UTF-8

	VARIABLES* vars = NULL;
	int i, errSign = 0, listSize = 2;
	// 加密的密码
	unsigned char* ucPassword = "123456";
	// 版权信息自定义
	unsigned char* owner = "湖南遥昇通信技术有限公司";
	unsigned char* promulgator = "马力哥";
	unsigned char* contact = "181xxxxxxxx";
	unsigned char* versionNumber = "V1.0.0";
	unsigned char* signature = "测试测试!";
	unsigned long datetime = 0;
	unsigned char authorization = 0;
	// 开辟变量的结构体缓存
	vars = (VARIABLES*)malloc(sizeof(VARIABLES));
	if (vars == NULL) goto ERR;

	// 设置里面的参数
	vars->RandomBytes_size = RANDOM_BYTE_LIMIT; // 建议为2-8个字节
	vars->Passwords_size = (int)(strlen(ucPassword) + 1);
	vars->pathListSize = 3;
	vars->rule = 0;
	vars->pathList = (unsigned char**)malloc(vars->pathListSize * sizeof(unsigned char*));
	if (vars->pathList == NULL) goto ERR;
	for (i = 0; i < vars->pathListSize; ++i) {
		vars->pathList[i] = (unsigned char*)malloc(URL_BYTE_LIMIT);
		if (vars->pathList[i] == NULL) goto ERR;
	}
	vars->jlmFile = (JLM_FILE*)malloc(sizeof(JLM_FILE));
	if (vars->jlmFile == NULL) goto ERR;
	// vars->jlmExtra = NULL;
	vars->jlmExtra = (JLM_EXTRA*)malloc(sizeof(JLM_EXTRA));
	if (vars->jlmExtra == NULL) goto ERR;
	vars->licenseFilePath = (unsigned char*)malloc(URL_BYTE_LIMIT);
	if (vars->licenseFilePath == NULL) goto ERR;
	// 设置扩展信息
	strncpy(vars->jlmExtra->owner, owner, strlen(owner));
	vars->jlmExtra->owner[strlen(owner)] = '\0';
	strncpy(vars->jlmExtra->promulgator, promulgator, strlen(promulgator));
	vars->jlmExtra->promulgator[strlen(promulgator)] = '\0';
	strncpy(vars->jlmExtra->contact, contact, strlen(contact));
	vars->jlmExtra->contact[strlen(contact)] = '\0';
	strncpy(vars->jlmExtra->versionNumber, versionNumber, strlen(versionNumber));
	vars->jlmExtra->versionNumber[strlen(versionNumber)] = '\0';
	strncpy(vars->jlmExtra->signature, signature, strlen(signature));
	vars->jlmExtra->signature[strlen(signature)] = '\0';
	vars->jlmExtra->datetime = datetime;
	vars->jlmExtra->authorization = authorization;
	// 开辟随机数的缓存空间
	vars->RandomBytes = (unsigned char*)malloc(vars->RandomBytes_size * sizeof(unsigned char));
	vars->Passwords = (unsigned char*)malloc(vars->Passwords_size * sizeof(unsigned char));
	if (vars->RandomBytes == NULL || vars->Passwords == NULL) goto ERR;
	// 开辟jlm路径的缓存空间
	vars->jlmFileUrl = (unsigned char*)malloc(URL_BYTE_LIMIT);
	if (vars->jlmFileUrl == NULL) goto ERR;

	// 此处需要从服务器上获取某个账户的证书指纹或SDK的商业授权下的证书指纹,如果某个账户下有指纹则vars->license_size为指纹的实际长度,否则vars->license_size = 0
	vars->license = (unsigned char*)malloc(JLM_FILE_HASH_BYTE_LIMIT);
	vars->license_size = 0;
	if (vars->license == NULL) goto ERR;
	// 开辟临时运算缓存
	vars->WriteOrReadBuff_Size = vars->OutByteArray_Size = vars->InByteArray_Size = BINARY_FILE_MAX_LIMIT;
	vars->InByteArray = (unsigned char*)malloc(vars->InByteArray_Size * sizeof(unsigned char));
	vars->OutByteArray = (unsigned char*)malloc(vars->OutByteArray_Size * sizeof(unsigned char));
	vars->WriteOrReadBuff = (unsigned char*)malloc(vars->WriteOrReadBuff_Size * sizeof(unsigned char));
	if (vars->InByteArray == NULL || vars->OutByteArray == NULL || vars->WriteOrReadBuff == NULL) goto ERR;
	// 开辟日志文件
	vars->log = (JLM_LOG*)malloc(sizeof(JLM_LOG));
	if (vars->log == NULL) goto ERR;
	// 设定每个包的大小,如果不设置则默认按照JLMPACK_BYTES_LIMIT来设置
	vars->jlmFile->packBytesLength = 629145600;// 1073741824;
	// 区分windows和linux
#ifdef _WINDOWS

	printf("_WINDOWS\n");
	const char* url1 = "D:\\CatalogTest";
	const char* url2 = "D:\\Lena.bmp";
	const char* url3 = "D:\\目录测试";
	const char* outurl = "D:\\test.jlm";
	const char* licensePath = "D:\\yesine_jlmpack_test.license";
#elif defined(_LINUX)

	printf("_LINUX\n");
	const char* url1 = "/home/wangjielin/Desktop/CatalogTest";
	const char* url2 = "/home/wangjielin/Desktop/Lena.bmp";
	const char* url3 = "/home/wangjielin/Desktop/JLMAUDIO";
	const char* outurl = "/home/wangjielin/Desktop/test.jlm";
	const char* licensePath = "/home/wangjielin/Desktop/yesine_jlmpack_test.license";
#endif
	strcpy(vars->licenseFilePath, licensePath);
	strcpy(vars->pathList[0], url1);
	strcpy(vars->pathList[1], url2);
	strcpy(vars->pathList[2], url3);
	strcpy(vars->Passwords, ucPassword);
	strcpy(vars->jlmFileUrl, outurl);

	srand((unsigned)time(NULL));

	// 调用创建接口
	errSign = JlmPack_Create(vars);
	printf("errSign = %d\n", errSign);
	if (errSign == 0) {
		printf("创建成功!\n");
		printf("vars->log->type = %d\n", vars->log->type);
		printf("vars->log->fileName = %s\n", vars->log->fileName);
		printf("vars->log->consistencyMark = ");
		for (i = 0; i < PACK_FILE_HASH_BYTE_LIMIT; ++i) {
			printf("%02X,", vars->log->consistencyMark[i]);
		}
		printf("\n");
		printf("vars->log->datetime = %lld\n", vars->log->datetime);
		printf("vars->totalBytes = %lld, vars->cumulativeBytes = %lld\n", vars->totalBytes, vars->cumulativeBytes);
	}

ERR:
	if (vars) {
		if (vars->InByteArray) free(vars->InByteArray);
		if (vars->OutByteArray) free(vars->OutByteArray);
		if (vars->WriteOrReadBuff) free(vars->WriteOrReadBuff);
		if (vars->log) free(vars->log);
		if (vars->jlmFile) free(vars->jlmFile);
		if (vars->jlmExtra) free(vars->jlmExtra);
		if (vars->RandomBytes)  free(vars->RandomBytes);
		if (vars->Passwords)  free(vars->Passwords);
		if (vars->jlmFileUrl)  free(vars->jlmFileUrl);
		if (vars->license) free(vars->license);
		if (vars->licenseFilePath) free(vars->licenseFilePath);
		if (vars->pathList) {
			for (i = vars->pathListSize - 1; i >= 0; --i) if (vars->pathList[i]) free(vars->pathList[i]);
			free(vars->pathList);
		}
		free(vars);
	}
}

三、注意事项

1、密码可以为空,那么解密时也不能输入密码,否则无法解密。
2、所有开辟的空间需要在外部释放。
3、一定要注意Config.h文件中的约束条件。
4、可自定义的结构体一定要把自定义的部分放在结构体的后面。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity小技巧】Unity字典序列化

字典序列化 在 Unity 中&#xff0c;标准的 C# 字典&#xff08;Dictionary<TKey, TValue>&#xff09;是不能直接序列化的&#xff0c;因为 Unity 的序列化系统不支持非 Unity 序列化的集合类型。可以通过手写字典实现 效果&#xff1a; 实现步骤&#xff1a; 继承ISe…

2024年制冷与空调设备运行操作证模拟考试题库及制冷与空调设备运行操作理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年制冷与空调设备运行操作证模拟考试题库及制冷与空调设备运行操作理论考试试题是由安全生产模拟考试一点通提供&#xff0c;制冷与空调设备运行操作证模拟考试题库是根据制冷与空调设备运行操作最新版教材&#…

振弦采集仪的工程安全监测实践与案例分析

振弦采集仪的工程安全监测实践与案例分析 振弦采集仪是一种常用的工程安全监测仪器&#xff0c;通过测量被监测结构的振动频率与振型&#xff0c;可以实时监测结构的安全状况。本文将结合实践经验和案例分析&#xff0c;探讨振弦采集仪在工程安全监测中的应用。 一&#xff0c…

奔驰G350升级原厂自适应悬挂系统有哪些作用

奔驰 G350 升级自适应悬挂系统后&#xff0c;可根据行车路况自动调整悬架高度和弹性&#xff0c;从而提升驾乘的舒适性和稳定性。 这套系统的具体功能包括&#xff1a; • 多种模式选择&#xff1a;一般有舒适、弯道、运动及越野等模式。例如&#xff0c;弯道模式在过弯时能为…

elk对于集群实例的日志的整合-基于logstash采集日志

说明&#xff1a;基于logstash采集日志 环境&#xff1a; 物理机192.168.31.151 一.启动2个测试实例&#xff0c;每5-10s随机生成一条订单日志 实例一 包位置&#xff1a;/home/logtest/one/log-test-0.0.1-SNAPSHOT.jar 日志位置:/docker/elastic/logstash_ingest_data/l…

塑造卓越企业家IP:多维度视角下的策略解析

在构建和塑造企业家IP的过程中&#xff0c;我们需要从多个维度进行考量&#xff0c;以确保个人品牌能够全面、立体地展现企业家的独特魅力和价值。以下是从不同角度探讨如何做好一个企业家IP的策略。 一、从个人特质出发 深入了解自我&#xff1a;企业家需要清晰地认识到自己的…

树立行业标杆,林清轩获“以油养肤开创者”市场地位认证

从0到1的创造&#xff0c;才能快速实现从1到100的裂变&#xff0c;这是亘古不变的商业逻辑。 6月25日&#xff0c;知名美妆国货品牌林清轩&#xff0c;获得了CIC灼识的市场地位确认书&#xff0c;确定“以油养肤开创者” 的地位。 近两年&#xff0c;以油养肤的概念逐渐兴起&am…

vivado VIO IP核

参考&#xff1a;pg159 VIO&#xff1a;可以模拟输入/输出功能&#xff0c;实时监视和修改FPGA中的信号&#xff0c;用于调试和验证&#xff0c;与ILA相比&#xff0c;VIO无需占用RAM资源。 VIO IP的输出对于FPGA内部逻辑是输入信号&#xff0c;可以在调试界面设置输入值&…

免费管饱不折腾,无公网NAS访问攻略,国产品牌异地自动组网技巧

前言 说起远程桌面、异地组网、内网穿透等等服务&#xff0c;大家脑海中第一反应是哪款产品&#xff0c;确实&#xff0c;现在市面上同类产品不少&#xff0c;但同时支持组网跟穿透的产品几乎没有。节点小宝作为一款创新型的远程管理工具&#xff0c;凭借其使用简单&#xff0…

欧盟《净零工业法案》通过,全球清洁能源市场迎来新格局

2024年5月27日&#xff0c;欧盟理事会正式通过《净零工业法案》&#xff0c;这意味着欧盟在推动工业绿色转型方面迈出了具有决定性的一步。这一法案的通过&#xff0c;不仅对欧盟的净零排放目标具有深远影响&#xff0c;也将对全球清洁能源市场产生重大影响。 《净零工业法案》…

2024年6月27日~2024年7月1日周报

目录 一、前言 二、完成情况 2.1 生成速度模型剖面图 2.2 吴恩达机器学习系列课程 2.2.1 介绍 2.2.1.1 机器学习 2.2.1.2 监督学习 2.2.1.3 无监督学习 2.2.2 单变量线性回归 2.2.2.1 模型表示 2.2.2.2 代价函数 2.2.2.3 梯度下降 2.2.2.4 梯度下降的线性回归 2.…

Java短剧系统

探索影视新体验 &#x1f4f1;一、引言&#xff1a;短剧时代的来临 在数字化的今天&#xff0c;我们见证了许多内容消费模式的转变。从长篇大论的电视剧到短小精悍的短视频&#xff0c;再到如今备受瞩目的短剧&#xff0c;观众对于影视内容的需求越来越多元化。而短剧系统微信…

网络请求的高效处理:C++ libmicrohttpd库详解

一、libmicrohttpd简介 libmicrohttpd是一个小型的C语言库&#xff0c;用于创建HTTP服务器和客户端。它提供了HTTP 1.1协议的完整实现&#xff0c;包括持久连接、管道化请求、虚拟主机等特性。libmicrohttpd的特点是&#xff1a; 轻量级&#xff1a;易于集成到C或C项目中。跨…

DolphinScheduler分布式集群部署指南(小白版)

官方文档地址&#xff1a;https://dolphinscheduler.apache.org/zh-cn/docs/3.1.9 DolphinScheduler简介 摘自官网&#xff1a;Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流…

深入理解计算机系统 CSAPP 8.4.2 fork函数

//fork.c #include <sys/types.h> #include <unistd.h> #include <stdio.h>int main() {pid_t fpid; //fpid表示fork函数返回的值int count 0;fpid fork();if (fpid < 0)printf("error in fork!");else if (fpid 0) {printf("\ni am th…

线性图标设计

创建图标区域 按键A&#xff0c;创建一个24x24的背景。 图标绘制包含几个点 矢量图形绘制&#xff1a;箭头、圆、三角...... 绘制箭头和矩形 1.下载图标 双击矩形选中要删除的点 调整一下即可得到下载的图标。 2.时间图标 按快捷键O画个圆&#xff0c;L加两条线变成一个时钟…

振动分析-6-轴承数据库之时频域短时傅里叶变换STFT

Python轴承故障诊断 (一)短时傅里叶变换STFT 1 短时傅里叶变换 1.1 基本原理 傅里叶变换的基本思想: 将信号分解成一系列不同频率的连续正弦波的叠加;或者说,将信号从时间域转换到频率域。 由于傅里叶变换是对整个信号进行变换,将整个信号从时域转换到频域,得到一个整体…

代码随想录算法训练营第九天|151.翻转字符串里的单词、右旋字符串、28. 实现 strStr()、459.重复的子字符串

打卡Day9 1.151.翻转字符串里的单词2.右旋字符串3.28. 实现 strStr()4.459.重复的子字符串 1.151.翻转字符串里的单词 题目链接&#xff1a;翻转字符串里的单词 文档讲解&#xff1a; 代码随想录 思路&#xff1a;首先&#xff0c;移除多余的空格&#xff1b;然后&#xff0c…

【MySQL】事务实现原理

事务 事务是将一组SQL语句打包成一个整体&#xff0c;在这组SQL的执行过程中&#xff0c;要么全部成功&#xff0c;要么全部失败。这组SQL语句可以是一条也可以是多条。 如果转账成功&#xff0c;应该满足以下要求&#xff1a; 张三的账户余额减少100&#xff0c;变成900&…