国产压缩包工具——JlmPackCore SDK说明(一)

news2024/11/18 18:23:05

一、什么是JlmPackCore SDK

(1)自主可控
JlmPackCore是一套基于我国自主知识产权的核心算法发明专利——杰林码(详系请参考《杰林码原理及应用》一书,也可以参考后续发表的相关论文),其中一篇会议论文,大家可以下载了解一下:

Hash Algorithm with Adaptive Hash Value Length Based on Weighted Probability Model

部分文章还在陆续发表中,敬请关注!在全球范围内我们的发明专利已经做了查新报告,如下:
在这里插入图片描述

(2)对比和优势
在市面上目前用的最多的是winrar,zip,7z等压缩工具,其中部分库是需要商业授权和收费的,相对他们我们的优势如下:
a、个人和学生等用户基础的压缩和解压功能全免费,仅需做一个注册即可;
b、无广告,无弹窗,编译码效率高;
c、归档算法、对称加密、无损压缩以及哈希算法全部是国产发明专利算法;
d、支持目前所有的系统和平台,目前支持国产的麒麟系统和鸿蒙等,支持ubuntu、windows、IOS/MOS等等系统;
e、支持的主流架构如ARM、X86、X64、RISC;
f、支持二次开发,商业应用的价格相当于rar的一半;

g、支持jlm压缩包的文件追踪和管控!!!,比如允许某些账号才解压,或允许某些电脑(MAC、CPU编号)才能解压,限时解压等功能,而且文件被谁解压、哪台电脑尝试解压,均会记录到服务器上。当然,我们也仅仅记录日志文件,不会保存用户的jlm文件,我们也没有这么大的服务器存储全球用户的jlm文件;

h、支持用户自主设定版权信息,jlm文件可记录版权信息资料,修改、删除或重命名均无法消除版权信息,永久跟随文件;
i、支持整体系统(软件+服务器管控系统)出售或合作;
j、支持学术全面合作,包括系统论文、专利等等;

(3)唯一logo(已注册商标)、官网logo及官网网址
jlmpack(已注册商标)软件logo:
JLMPACK软件的logo
官网logo:
JLMPACK官网logo
官网网址:www.jlmpack.com(暂时支持英文和中文,后续会支持各国语言)

二、JlmPackCoreV1.0(client).rar下载地址和文件列表和描述

您可以访问官网下载,也可以在CSDN中下载,CSDN的下载地址为:

JlmPackCoreV1.0(client).rar下载地址

jlmpack软件全面面世,我们同步发布JlmPackCoreV1.0(client).rar和JlmPackCoreV1.0(client).jlm压缩包文件,其中包括了的清单如下:
JlmPackCoreV1.0(client).rar文件清单
其中文件夹中保存的是相应的库(a、so、lib和dll等),yesine_jlmpack_test.license为测试授权证书有效时间到2024年底,main.c是所有的案例(我将在后续的文章中分别做出详细的介绍),Config.h是部分跨平台的宏定义(部分内容可以设定和调整),JlmPack.h为库函数的接口文件。错误编号说明(Error number specification).txt为SDK中所有错误编号的说明。

特别注意:注意系统格式,比如UTF-8,GBK均涉及中文路径问题,请调试好格式!

三、Config.h说明

Config.h是类似配置文件的宏定义头,主要是针对跨平台的定义和部分变量长度的定义。不建议轻易修改相关参数,否则就编程了自定义jlm文件格式了,无法跟通用jlmpack软件适配。

#pragma once
/**************************************************************************
 * @作者 王杰林 2024-05-08
 * @功能 配置信息,主要方便调整SDK中部分参数
 * @版权 湖南遥昇通信技术有限公司
 * @版本 1.0
 * @邮件 254908447@qq.com
 **************************************************************************/
#ifndef JLMPACKCONFIG_H  
#define JLMPACKCONFIG_H
 /**************************************************************************
  采用预处理指令自定义跨平台的函数接口
  **************************************************************************/
#if defined(_WIN32) || defined(_WIN64)

#include "Windows.h"
#include "direct.h"
  // windows下删除目录函数为RemoveDirectoryA
#define removeEmptyFolder RemoveDirectoryA
// windows下创建目录函数为_mkdir
#define JlmPack_CreateFolder(path) _mkdir(path)
// 通过JLMPACK_API导出函数
#define JLMPACK_API __declspec(dllexport)

#else

#include "sys/stat.h"
#include "sys/types.h"
#include "unistd.h"
  // linux和unix下的删除目录函数为rmdir
#define removeEmptyFolder rmdir
// linux和unix下的创建目录函数为mkdir
#define JlmPack_CreateFolder(path) mkdir(path, S_IRWXU)

// 因编译时采用-fvisibility = hidden,通过JLMPACK_API导出函数
#define JLMPACK_API __attribute__ ((visibility ("default")))

#endif


  /**************************************************************************
   JLMPACK的一些核心宏定义
   **************************************************************************/

   // 随机读取文件中READ_BYTE_LIMIT_TO_COMPUTE_HASH个字节用于计算哈希值
#define READ_BYTE_LIMIT_TO_COMPUTE_HASH 1024
// 随机加密的随机数长度,随机数越大安全性越高
#define RANDOM_BYTE_LIMIT 8
// 当前文件的哈希值长度,建议8到16字节
#define HASH_BYTE_LIMIT 8
// 统一规范文件名(不含路径,带后缀)的最大字节数
#define NAME_BYTE_LIMIT 200
// 统一规范路径(带文件名和后缀)的最大字节数
#define URL_BYTE_LIMIT 1000
// 最大允许的目录数,即所有的目录和子目录、文件的总和不能超过CATALOG_MAX_LIMIT,可在此处调整
#define CATALOG_MAX_LIMIT 10000
// 目录嵌套深度,即文件夹下的文件夹,最大嵌套深度
#define FOLDERS_NESTED_MAX_LIMIT 1000


// 哈希值的长度限制
#define JLM_FILE_HASH_BYTE_LIMIT 64
#define PACK_FILE_HASH_BYTE_LIMIT 32

// JLM_EXTRA中部分对象的字节长度限制
#define EXTRA_BYTE_LIMIT 100

// JlmPack_JLMSE函数的两个状态:加解密模式
#define ENCODE_MODEL 0
#define DECODE_MODEL 1

// 日志描述的字节大小
#define NOTE_BYTE_LIMIT 200

// 限制二进制文件读写的最大缓存为10MB,可以设置和调整以适应最佳效率,不能低于4MB,不能太大占内存过多
#define BINARY_FILE_MAX_LIMIT 10485760  //10485760  16777216

// 设置包的最大个数,一般来讲打包的目的是把大量的文件和文件夹打包成为几个压缩包,这里设置为100,能满足很多情况下,注意配合PACK_BYTES_LIMIT设置
#define MAX_NUMBER_PACKS 100

// 将JLM压缩包切割成多个包,每个包最大字节数为PACK_BYTES_LIMIT,通过JLM_FILE.packBytesLength自定义
#define JLMPACK_BYTES_LIMIT 4227858432ULL

#endif

四、JlmPack.h接口说明

JlmPack.h包括了主要的文件、扩展(版权信息),日志和目录等结构体,还包括了JlmPack_JLMHA(杰林码哈希算法)和JlmPack_JLMSE(杰林码随机对称加解密和无损压缩算法)两个基础算法库函数接口,其他函数接口请参考后续的文章进行说明。

#pragma once
/**************************************************************************
 * @作者 王杰林 2024-06-20
 * @功能 遍历全部目录的文件夹以及文件,并保存到目录对象中,支持linux和windows
 * @版权 湖南遥昇通信技术有限公司
 * @版本 1.0
 * @邮件 254908447@qq.com
 **************************************************************************/
#ifndef JLMPACK_H  
#define JLMPACK_H

 // 包含配置头文件,必不可少
#include "Config.h"

// JLM文件的头部信息,头部信息必须是放在第1个包的初始位置,下面的顺序不能修改的,修改可能会出错
typedef struct
{
	unsigned char jlmHeadSign[4];                              // JLM压缩包文件的头部标识为{ 'J', 'L', 'M', ' '},音频为{ 'J', 'L', 'M', 'A'},视频为{ 'J', 'L', 'M', 'V'},无法修改,就算传递进来也会被重置
	unsigned char consistencyMark[PACK_FILE_HASH_BYTE_LIMIT];  // 用来统一主包和子包以及系统后台信息,具有相同的consistencyMark才算一个JLM文件
	unsigned int packID;							           // 包编号分别为1,2,3,...等等,注意一定是从1开始
	unsigned int catalogBytesLength;                           // 目录的原始字节长度,尚未编码的字节长度,也是jlm文件除了JLM_FILE以外的目录存放长度
	unsigned int packSize;                                     // 整个jlm根据packBytesLength切割成packSize个子包
	unsigned int packBytesLength;                              // 单个包的字节数量(默认最大单个包大小为PACK_BYTES_LIMIT字节数)
	unsigned int encryptionWindow;                             // 加密轮函数的字节窗口,自动设定为BINARY_FILE_MAX_LIMIT - 2097152,解码时该值修改后将无法解密
	unsigned int extraSize;                                    // 记录JLM_EXTRA的字节数,如果extraSize = 0说明没有JLM_EXTRA,如果extraSize = sizeof(JLM_EXTRA)说明存在JLM_EXTRA
	unsigned long long fileBytesLength;                        // 压缩后的总字节长度,包括了头部信息的字节数,加密压缩后的数字证书和目录以及文件数据等(最大2^64-1个字节)
	unsigned char license[JLM_FILE_HASH_BYTE_LIMIT];           // 数字证书的数字指纹,商业授权版:由湖南遥昇通信技术有限公司颁发的SDK授权数字证书哈希值;个人版本由官网申请的个人证书哈希值
}JLM_FILE;

/**************************************************************************************
JLM_CATALOG目录对象,非常重要,是预览目录的重要结构体,仅用于展示JLM压缩包中的目录信息
***************************************************************************************/
typedef struct
{
	int ID;                                  // 当前目录的ID
	int FID;                                 // 上一层目录的ID号,顶层该ID号为0
	char type;                               // 文件类型,是文件夹还是文件类型,0表示文件夹,1表示文件
	char name[NAME_BYTE_LIMIT];              // 当前文件或文件夹的名称,包括了后缀名
	unsigned long long byteslength;          // 原始文件的字节长度,如果是文件夹,则包括了文件夹下的所有文件,如果是文件则是文件的字节数
	unsigned char hv[HASH_BYTE_LIMIT];       // 哈希值(校验或签名),最大支持8个字节(默认是4个字节)
	long long time;                          // 文件创建的时间
}JLM_CATALOG;

/**************************************************************************************
目录列表信息对象,非常重要,是预览目录的重要结构体,也是权限验证的重要结构体
***************************************************************************************/
typedef struct
{
	int ID;                                  // 当前目录的ID
	int FID;                                 // 上一层目录的ID号,方便进行退回
	char name[NAME_BYTE_LIMIT];              // 目录名称
	unsigned long long byteslength;          // 目录下的所有字节数
	long long time;                          // 目录创建的时间
	JLM_CATALOG* CatalogList;                // 子目录队列
	int CatalogListSize;                     // 子目录列表规模
}JLM_CATALOGINFOR;

/**************************************************************************************
JLM_EXTRA对象属于可选项和可自定义结构体,主要用于版权控制,不建议随意修改,只能增加
1、主函数采用sizeof(JLM_EXTRA)计算JLM_EXTRA的实际字节数并写入到文件末尾,所以不能定义指针变量
2、存放在JLM文件的最末尾(或者最后一个包),文件末尾从fileLength - extraLength字节开始属于JLM_EXTRA对象
***************************************************************************************/
typedef struct
{
	char owner[EXTRA_BYTE_LIMIT];                        // 版权拥有人(公司或个人)
	char promulgator[EXTRA_BYTE_LIMIT];                  // 颁布人,或发行人(公司或个人)
	char contact[EXTRA_BYTE_LIMIT];                      // 联系方式
	char versionNumber[EXTRA_BYTE_LIMIT];                // 版本号
	long long datetime;                                  // 发布时的系统时间戳
	unsigned char authorization;                         // 本JLM压缩包对外授权分类,0表示免费,1表示共享授权,2表示商业授权(具体的方式由用户自定义)
	unsigned char signature[JLM_FILE_HASH_BYTE_LIMIT];   // 数字签名,采用了JLMHA算法
}JLM_EXTRA;

/**************************************************************************************
日志结构体,即创建、解包、追加和删除均有日志文件输出,输出的日志文件可以在本地生成也可以存储到网络上
本日志文件只记录时间,动作,至于其他更多信息,可以通过LOGS结构体追加信息
***************************************************************************************/
typedef struct
{
	// 下面这4个对象属于系统对象严禁修改名字和删除,内容由库自动完成填入
	int type;                                                  // 0表示创建,1表示解包,2表示插入,3表示删除,4表示修改(一般指部分文件的重命名),5表示预览目录
	unsigned char consistencyMark[PACK_FILE_HASH_BYTE_LIMIT];  // 用来统一主包和子包以及系统后台信息
	unsigned char fileName[NAME_BYTE_LIMIT];                   // 文件名
	long long datetime;                                        // 发生的系统时间戳
	// 可以在此处追加其他对象,追加的对象和处理请到JLMPackAuthorityControl类中处理
}JLM_LOG;

/**************************************************************************************
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;

#ifdef __cplusplus
extern "C" {
#endif
	/*************************************************************************************
	获取授权证书内数字签名的函数
	输入:
	VARIABLES* vars
	返回:
	Errsign:错误标识,0无错,大于1为错误
	*************************************************************************************/
	JLMPACK_API int JlmPack_GetLicense(VARIABLES* vars);

	/*************************************************************************************
	JLMHA哈希算法函数,根据输入的数据获取长度为OutByteArray_size的哈希值,返回1表示计算成功
	1、根据InByteArray生成哈希值,RandomByte是随机生成的字节值,HashByteArray的第0个字节用于存放RandomByte的值
	2、验证的时候,必须将老的哈希值A第一个字节作为RandomByte传递给JLMHA,然后再根据InByteArray计算出新的哈希值B,比较两者是否相同
	输入:
	RandomByte:生成哈希值时RandomByte为0-255的随机数;检验哈希值时RandomByte必须是哈希值的首个字节(前8个比特)
	InByteArray:用于计算哈希值的原始数据
	InByteArray_size:InByteArray的字节数
	HashByteArray:生成哈希值时HashByteArray中HashByteArray_size个字节必须为0x00;迭代计算哈希值时HashByteArray中HashByteArray_size可以为上一次得出的哈希值
	HashByteArray_size:需要生成的哈希值长度,可自定义
	返回:
	Errsign:错误标识,0无错,大于1为错误
	*************************************************************************************/
	JLMPACK_API int JlmPack_JLMHA(unsigned char RandomByte, unsigned char* InByteArray, unsigned int InByteArray_size, unsigned char* HashByteArray, unsigned int HashByteArray_size);

	/*************************************************************************************
	JLMSE对称加密算法函数,注意本函数不做密码校验,无论密码输入是否正确,均会给出一个译码结果
	输入:
	RandomBytes:随机数,主要是抗量子计算破解
	RandomBytes_size:随机数的长度
	Passwords:加密或解码密码
	Passwords_size:密码的长度
	InByteArray:需要编译码的字节缓存
	InByteArray_size:InByteArray的字节数
	OutByteArray:加解密后的字节缓存
	OutByteArray_size:输入需要编译码的字节数,返回实际编译码的字节数
	model:加密模式model = 0,解密模式model = 1
	返回:
	Errsign:错误标识,0无错,大于0出错
	*************************************************************************************/
	JLMPACK_API int JlmPack_JLMSE(unsigned char* RandomBytes, unsigned int RandomBytes_size, unsigned char* Passwords, unsigned int Passwords_size, unsigned char* InByteArray, unsigned int InByteArray_size, unsigned char* OutByteArray, unsigned int* OutByteArray_size, int model);

	/*************************************************************************************
	创建函数,根据参数相关的信息创建一个jlm压缩包
	特别注意:
	1、文件或文件夹通过pathList传递
	2、编码后jlm文件的路径通过jlmFileUrl传递,必须是带文件名(允许不带后缀.jlm)
	3、各权限编号通过rule传递
	4、IdList和IdList_Size在本函数内是无效的
	5、fatherCer为父亲节点的数字证书的数字指纹,可以为空,如果不为空必须与网站后台或license的指纹一致(fatherCer可以查询用户的数字证书),而且整个jlm文件全部采用fatherCer进行签名
	6、密码通过Passwords传递
	7、随机数通过RandomBytes传递,建议采用4-16个随机数,这个是防止量子破解的核心,不建议为空
	输入:
	VARIABLES*:参数变量
	返回:
	Errsign:错误标识
	log中的信息
	*************************************************************************************/
	JLMPACK_API int JlmPack_Create(VARIABLES* vars);

	/*************************************************************************************
	获取权限值的函数,除了JlmPack_Create函数,其他函数在使用前都必须完成权限检验
	特别注意:
	1、编码后jlm文件的路径通过jlmFileUrl传递,必须是带文件名(允许不带后缀.jlm)
	2、权限值通过vars->rule返回
	3、权限获取不记录日志
	输入:
	VARIABLES*:参数变量
	返回:
	Errsign:错误标识
	*************************************************************************************/
	JLMPACK_API int JlmPack_GetRule(VARIABLES* vars);

	/*************************************************************************************
	解包函数:输入IdList列表,解压和解密出IdList列表下面的所有文件或文件夹,解压需要做权限控制
	特别注意:
	1、如果解压整个压缩包,仅需在IdList中包括了0的ID号
	2、译码后的文件存储路径通过pathList[0]传递,而且仅允许pathListSize = 0
	3、待解压的JLM压缩包路径通过jlmFileUrl传递,支持jlmFileUrl = XXX_PackX.jlm(程序会自动找到主文件XXX.jlm)
	4、其他的通过对应的参数传递,注意RandomBytes会被本函数覆盖掉
	安全方案:
	1、用Passwords直接解密jlm文件的目录信息,如果解密错误返回无法解密
	2、如果解密正确,则可获得CatalogInfor对象以及rule的值,如果rule表达了需要强制服务器校验,则进行第3步,否则直接译码
	3、将rule、JLM_FILE.cer、JLM_FILE.consistencyMark和Username、Mac(本地获取)、CPU编号(本地获取)等等信息经过随机加密后推送给后台系统进行验证
	4、验证失败返回NULL,则函数UnpackJlmPackFile将根据rule进行动作
	5、如果验证成功,则返回当前文件在服务器上的全部日志信息
	输入:
	VARIABLES*:参数变量
	返回:
	Errsign:错误标识
	*************************************************************************************/
	JLMPACK_API int JlmPack_Unpack(VARIABLES* vars);

	/*************************************************************************************
	向Jlm文件中追加新待编码文件的函数,追加的过程不会解密任何文件,仅仅重新组织jlm文件包和修改目录信息
	特别注意
	1、只能设置IdList_Size = 1且IdList[0] = 某ID号(可以为0,表示新增信息存放在根目录下),意思是把新增信息存放在某个目录ID下,如果当前的ID为文件将自动存储到
	2、待添加的文件和文件夹路径通过pathList传递
	3、jlm压缩包文件路径通过jlmFileUrl传递,支持jlmFileUrl = XXX_PackX.jlm(程序会自动找到主文件XXX.jlm)
	4、其他的通过对应的参数传递
	输入:
	VARIABLES*:参数变量
	返回:
	Errsign:错误标识
	*************************************************************************************/
	JLMPACK_API int JlmPack_Insert(VARIABLES* vars);

	/*************************************************************************************
	删除Jlm压缩包中某些文件的函数,删除的过程不会解密任何文件,仅仅重新组织jlm文件包和修改目录信息
	特别注意
	1、待删除的目录ID号通过IdList传递,此时IdList_Size>=1
	2、jlm压缩包文件路径通过jlmFileUrl传递,支持jlmFileUrl = XXX_PackX.jlm(程序会自动找到主文件XXX.jlm)
	3、其他的通过对应的参数传递
	输入:
	VARIABLES*:参数变量
	返回:
	Errsign:错误标识
	*************************************************************************************/
	JLMPACK_API int JlmPack_Delete(VARIABLES* vars);

	/*************************************************************************************
	重命名某个ID的名称,要求是密码必须正确且权限足够,重命名过程无法修改目录中的任何缀名,防止文件格式错误
	特别注意:
	1、只能设置IdList_Size = 1且IdList[0] = 某ID号(可以为0,浏览根目录同级的文件和文件夹),每次只能针对一个ID进行重命名
	2、jlm压缩包文件路径通过jlmFileUrl传递,支持jlmFileUrl = XXX_PackX.jlm(程序会自动找到主文件XXX.jlm)
	3、新的名称用pathList[0]传递,所以pathListSize = 1
	输入:
	VARIABLES*:参数变量,重点是jlmFileUrl和IdList[0]
	返回:
	JLM_CATALOGINFOR*:目录信息
	*************************************************************************************/
	JLMPACK_API int JlmPack_Rename(VARIABLES* vars);

	/*************************************************************************************
	预览Jlm压缩包的某个ID下的同级文件和文件夹列表,要求是密码必须正确且权限足够
	特别注意:
	1、只能设置IdList_Size = 1且IdList[0] = 某ID号(可以为0,浏览根目录同级的文件和文件夹)
	如果IdList[0]指向的是文件表示当前文件的同级文件和文件夹
	如果IdList[0]指向的是文件夹表示当前文件夹下的同级的文件和文件夹
	2、jlm压缩包文件路径通过jlmFileUrl传递,支持jlmFileUrl = XXX_PackX.jlm(程序会自动找到主文件XXX.jlm)
	3、其他的通过对应的参数传递
	输入:
	VARIABLES*:参数变量,重点是jlmFileUrl和IdList[0]
	返回:
	JLM_CATALOGINFOR*:目录信息
	*************************************************************************************/
	JLMPACK_API JLM_CATALOGINFOR* JlmPack_BrowseCatalog(VARIABLES* vars, int* errSign);

#ifdef __cplusplus
}
#endif
#endif

五、错误编号说明(Error number specification).txt说明

错误编号是SDK调试的核心,大家可以通过错误编号对自己的调用程序进行测试或调试!

下面是各个编号的说明:
400:创建目录时输入的const char** pathList为NULL,或则unsigned int listSize<= 0,即无效输入
401:创建目录时unsigned int listSize>CATALOG_MAX_LIMIT,即列表中的文件目录数大于了Config.h中设定的值,可调整Config.h中CATALOG_MAX_LIMIT的值
402:创建目录时CatalogInfor的内存开辟失败
403:创建目录时CatalogInfor.urlsList或者CatalogInfor.CatalogList的内存开辟失败
404:无
405:所有子目录超过了CATALOG_MAX_LIMIT的限制,可调整Config.h中CATALOG_MAX_LIMIT的值
406:创建目录时CatalogInfor的内存开辟失败
407:创建目录时CatalogInfor.urlsList或者CatalogInfor.CatalogList的内存开辟失败

408:重命名时输入的CatalogInfor* cataloginfor为NULL
409:重命名时输入的const char* newName(名字)为空
410:重命名时输入的int ID小于等于0,注意根目录禁止重命名,默认就是root
411:重命名时输入的int ID大于cataloginfor->MaxID,说明不存在这样的目录
412:重命名时同级目录下存在与newName相同的名字

413:目录序列化时输入CatalogInfor* catalogInfor为NULL或者catalogInfor->CatalogListSize <= 0
414:目录序列化时输入的unsigned int* BytesArrayLength为NULL,这个参数必须传递指针,需要返回实际序列化后的长度
415:目录序列化时返回数组BytesArray内存开辟失败

416:目录逆序列化时输入unsigned char* BytesArray为NULL或者unsigned int BytesArrayLength <= 0
417:目录逆序列化时返回的cataloginfor内存开辟失败
418:目录逆序列化时目录的数量超过了CATALOG_MAX_LIMIT的限制或cataloginfor->CatalogListSize <= 0或cataloginfor->MaxID > CATALOG_MAX_LIMIT或cataloginfor->MaxID <= 0,可调整Config.h中CATALOG_MAX_LIMIT的值
419:目录逆序列化后的目录字节数与实际输入的字节数不符合
420:目录逆序列化时cataloginfor->CatalogList内存开辟失败

421:根据最大ID创建目录时输入的const char** pathList为NULL,或则unsigned int listSize<= 0,即无效输入
422:根据最大ID创建目录时输入的listSize>CATALOG_MAX_LIMIT,即列表中的文件目录数大于了Config.h中设定的值,可调整Config.h中CATALOG_MAX_LIMIT的值
423:根据最大ID创建目录时返回的cataloginfor内存开辟失败
424:根据最大ID创建目录时CatalogInfor.urlsList或者CatalogInfor.CatalogList的内存开辟失败
425:根据最大ID创建目录时所有子目录超过了CATALOG_MAX_LIMIT的限制,可调整Config.h中CATALOG_MAX_LIMIT的值
426:根据最大ID创建目录时CatalogInfor的内存开辟失败
427:根据最大ID创建目录时CatalogInfor.urlsList或者CatalogInfor.CatalogList的内存开辟失败

428:追加目录时输入的oldCatalogInfor为NULL
429:追加目录时输入的thisID < 0或thisID > oldCatalogInfor->MaxID,即无效目录的ID号,注意允许thisID = 0,即追加到根目录下
430:追加目录时判断新增的根目录是否与thisID下的子目录存在相同的名字
431:追加目录时CatalogInfor* cataloginfor内存开辟失败
432:追加目录时cataloginfor->urlsList和cataloginfor->CatalogList内存开辟失败

433:删除目录时输入的oldCatalogInfor为NULL
434:删除目录时输入的delIdList == NULL 或 listSize <= 0
435:删除目录时输入的delIdList中存在0号ID,根目录删除意思就是整个jlm文件删除,无需任何的目录操作
436:删除目录时CatalogInfor* tmpNewCatalogInfor内存开辟失败
437:删除目录时CatalogInfor** OutCatalogInfor内存开辟失败
438:删除目录时OutCatalogInfor[0]和OutCatalogInfor[1]内存开辟失败
439:删除目录时tmpNewCatalogInfor->CatalogList或OutCatalogInfor[1]->CatalogList内存开辟失败
440:删除目录时tmpNewCatalogInfor->urlsList或OutCatalogInfor[0]->urlsList内存开辟失败
441:删除目录时OutCatalogInfor[0]->CatalogList内存开辟失败

1100:JLMHA函数输入的InByteArray == NULL或InByteArray_size == 0
1101:JLMHA函数输入的HashByteArray == NULL或HashByteArray_size == 0
1102:JLMHA函数编码失败

1200:JLMSE函数输入的InByteArray == NULL或InByteArray_size == 0
1201:JLMSE函数输入的OutByteArray == NULL或OutByteArray_size == 0
1202:JLMSE函数输入的model无效,只能输入01

1300:JlmPack_Create函数输入的VARIABLES* vars为NULL
1301:JlmPack_Create函数输入的vars->log为NULL
1302:JlmPack_Create函数输入的vars->jlmFile为NULL
1303:JlmPack_Create函数输入的vars->pathList == NULL 或 vars->pathListSize == 0
1304:JlmPack_Create函数输入的vars->jlmFileUrl为NULL
1305:JlmPack_Create函数输入的vars->InByteArray为NULL
1306:JlmPack_Create函数输入的vars->OutByteArray为NULL
1307:JlmPack_Create函数输入的vars->RandomBytes == NULL 或 vars->RandomBytes_size != RANDOM_BYTE_LIMIT
1308:JlmPack_Create函数写文件指针为NULL
1309:JlmPack_Create函数写文件失败,写入文件的长度与待写入的长度sizeof(JLM_FILE)不一致
1310:JlmPack_Create函数写文件失败,写入文件的长度与待写入的目录长度不一致
1311:JlmPack_Create函数写文件指针为NULL
1312:JlmPack_Create函数写文件失败,写入文件的长度与待写入的长度sizeof(JLM_FILE)不一致
1313:JlmPack_Create函数写文件失败,写入文件的长度与待写入的目录长度不一致

1320:编码函数当前待编码的文件目录Catalog* catalog为NULL
1321:编码函数FILE* readfile为NULL
1322:编码函数杰林码编码器WJLWMCoder* coder内存开辟失败

1340:编码函数写文件失败,写入文件的长度与待写入的长度不一致
1341:编码函数写文件失败,写入文件的长度与待写入的长度不一致
1342:编码函数写文件失败,写入文件的长度与待写入的长度不一致
1343:编码函数写文件失败,写入文件的长度与待写入的长度不一致

1400:JlmPack_Unpack函数输入的VARIABLES* vars为NULL
1401:JlmPack_Unpack函数输入的vars->pathList == NULL或vars->pathListSize == 0或vars->pathListSize >= 2
1402:JlmPack_Unpack函数输入的vars->jlmFile为NULL
1403:JlmPack_Unpack函数输入的vars->IdList == NULL或vars->IdList_Size <= 0
1404:JlmPack_Unpack函数输入的vars->jlmFileUrl为NULL
1405:JlmPack_Unpack函数输入的vars->InByteArray为NULL
1406:JlmPack_Unpack函数输入的vars->OutByteArray为NULL
1407:JlmPack_Unpack函数输入的vars->jlmExtra为NULL
1408:JlmPack_Unpack函数输入的vars->RandomBytes == NULL或vars->RandomBytes_size != RANDOM_BYTE_LIMIT
1409:JlmPack_Unpack函数jlmpack为NULL或tmpJlmPack为NULL或pathsArray为NULL
1410:JlmPack_Unpack函数pathsArray[i]NULL
1411:JlmPack_Unpack函数realJlmFilePath为NULL
1412:JlmPack_Unpack函数realJlmFilePath[i]NULL
1413:JlmPack_Unpack函数FILE* readfile为NULL
1414:JlmPack_Unpack函数读取文件失败,读取的长度错误
1415:JlmPack_Unpack函数FILE* readfile为NULL
1416:JlmPack_Unpack函数读取文件失败,读取的长度错误
1417:JlmPack_Unpack函数输入的vars->InByteArray_Size和vars->OutByteArray_Size错误,必须大于等于vars->jlmFile->encryptionWindow + 2097152
1418:JlmPack_Unpack函数读取文件失败,读取的长度错误
1419:JlmPack_Unpack函数密码错误或文件不是JLM文件
1420:JlmPack_Unpack函数密码错误或文件不是JLM文件
1421:JlmPack_Unpack函数FILE* readfile为NULL
1422:JlmPack_Unpack函数读取文件失败,读取的长度错误
1423:JlmPack_Unpack函数FILE* readfile为NULL
1424:JlmPack_Unpack函数读取文件失败,读取的长度错误
1425:JlmPack_Unpack函数FILE* readfile为NULL
1426:JlmPack_Unpack函数读取文件失败,读取的长度错误

1440:JLM文件遍历函数目录路径错误
1441:JLM文件遍历函数FILE* readfile为NULL

1460:解码函数WJLWMCoder* coder内存开辟失败
1461:解码函数FILE* writefile为NULL
1462:解码函数FILE* readfile为NULL
1463:解码函数读取文件失败,读取的长度错误
1464:解码函数FILE* readfile为NULL
1465:解码函数读取文件失败,读取的长度错误
1466:解码函数写文件失败,写入文件的长度与待写入的长度不一致
1467:解码函数,输入的密码错误或密文错误
1468:解码函数写文件失败,写入文件的长度与待写入的长度不一致
1469:解码函数,输入的密码错误或密文错误
1470:解码函数写文件失败,写入文件的长度与待写入的长度不一致
1471:解码函数FILE* readfile为NULL
1472:解码函数读取文件失败,读取的长度错误
1473:解码函数读取文件失败,读取的长度错误

1500:JlmPack_Insert函数输入的VARIABLES* vars为NULL
1501:JlmPack_Insert函数输入的vars->pathList == NULL或vars->pathListSize == 0
1502:JlmPack_Insert函数输入的vars->jlmFileUrl为NULL
1503:JlmPack_Insert函数输入的vars->IdList == NULL或vars->IdList_Size == 0或vars->IdList_Size >= 2
1504:JlmPack_Insert函数输入的vars->jlmFile为NULL
1505:JlmPack_Insert函数输入的vars->InByteArray为NULL
1506:JlmPack_Insert函数输入的vars->OutByteArray为NULL
1507:JlmPack_Insert函数输入的vars->jlmExtra为NULL
1508:JlmPack_Insert函数输入的vars->RandomBytes == NULL或vars->RandomBytes_size != RANDOM_BYTE_LIMIT
1509:JlmPack_Insert函数jlmpack == NULL或tmpJlmPack == NULL
1510:JlmPack_Insert函数realJlmFilePath == NULL或newJlmFilePath == NULL
1511:JlmPack_Insert函数realJlmFilePath[i] == NULL或newJlmFilePath[i] == NULL
1512:JlmPack_Insert函数FILE* readfile为NULL
1513:JlmPack_Insert函数FILE* readfile为NULL
1514:JlmPack_Insert函数读取文件失败,读取的长度错误
1515:JlmPack_Insert函数读取文件失败,读取的长度错误
1516:JlmPack_Insert函数密码或密文错误
1517:JlmPack_Insert函数密码或密文错误
1518:JlmPack_Insert函数FILE* readfile为NULL
1519:JlmPack_Insert函数读取文件失败,读取的长度错误
1520:JlmPack_Insert函数FILE* readfile为NULL
1521:JlmPack_Insert函数读取文件失败,读取的长度错误
1522:JlmPack_Insert函数FILE* readfile为NULL
1523:JlmPack_Insert函数读取文件失败,读取的长度错误
1524:JlmPack_Insert函数FILE* writefile为NULL
1525:JlmPack_Insert函数写文件失败,写入文件的长度与待写入的长度不一致
1526:JlmPack_Insert函数写文件失败,写入文件的长度与待写入的长度不一致
1527:JlmPack_Insert函数FILE* writefile为NULL
1528:JlmPack_Insert函数写文件失败,写入文件的长度与待写入的长度不一致
1529:JlmPack_Insert函数写文件失败,写入文件的长度与待写入的长度不一致
1530:JlmPack_Insert函数FILE* readfile为NULL

1560:文件复制函数FILE* readfile为NULL
1561:文件复制函数读取文件失败,读取的长度错误
1564:文件复制函数FILE* readfile为NULL
1565:文件复制函数读取文件失败,读取的长度错误
1566:文件复制函数读取文件失败,读取的长度错误

1580:文件复制函数FILE* readfile为NULL
1581:文件复制函数FILE* writefile为NULL
1583:文件复制函数写文件失败,写入文件的长度与待写入的长度不一致

1600:JlmPack_Delete函数输入的VARIABLES* vars为NULL
1601:JlmPack_Delete函数输入的vars->jlmFileUrl为NULL
1602:JlmPack_Delete函数输入的vars->IdList == NULL或vars->IdList_Size == 0
1603:JlmPack_Delete函数输入的vars->jlmFile为NULL
1604:JlmPack_Delete函数输入的vars->InByteArray为NULL
1605:JlmPack_Delete函数输入的vars->OutByteArray为NULL
1606:JlmPack_Delete函数输入的vars->jlmExtra为NULL
1607:JlmPack_Delete函数输入的vars->RandomBytes == NULL或vars->RandomBytes_size != RANDOM_BYTE_LIMIT
1608:JlmPack_Delete函数输入的vars->IdList中存在为0的ID号,如果删除的ID存在根目录,请直接删除整个JLM文件
1609:JlmPack_Delete函数jlmpack == NULL或tmpJlmPack == NULL,内存开辟失败
1610:JlmPack_Delete函数realJlmFilePath == NULL或newJlmFilePath == NULL,内存开辟失败
1611:JlmPack_Delete函数realJlmFilePath[i] == NULL或newJlmFilePath[i] == NULL,内存开辟失败
1612:JlmPack_Delete函数FILE* readfile为NULL
1613:JlmPack_Delete函数FILE* readfile为NULL
1614:JlmPack_Delete函数读取文件失败,读取的长度错误
1615:JlmPack_Delete函数读取文件失败,读取的长度错误
1616:JlmPack_Delete函数密码或密文错误
1617:JlmPack_Delete函数密码或密文错误
1618:JlmPack_Delete函数FILE* readfile为NULL
1619:JlmPack_Delete函数读取文件失败,读取的长度错误
1620:JlmPack_Delete函数FILE* readfile为NULL
1621:JlmPack_Delete函数读取文件失败,读取的长度错误
1622:JlmPack_Delete函数FILE* readfile为NULL
1623:JlmPack_Delete函数读取文件失败,读取的长度错误
1624:JlmPack_Delete函数FILE* writefile为NULL
1625:JlmPack_Delete函数写文件失败,写入文件的长度与待写入的长度不一致
1626:JlmPack_Delete函数写文件失败,写入文件的长度与待写入的长度不一致
1627:JlmPack_Delete函数FILE* writefile为NULL
1628:JlmPack_Delete函数写文件失败,写入文件的长度与待写入的长度不一致
1629:JlmPack_Delete函数写文件失败,写入文件的长度与待写入的长度不一致
1630:JlmPack_Delete函数FILE* readfile为NULL

1700:JlmPack_Rename函数输入的VARIABLES* vars为NULL
1701:JlmPack_Rename函数输入的vars->jlmFileUrl为NULL
1702:JlmPack_Rename函数输入的vars->pathList为NULL或vars->pathListSize == 0或vars->pathListSize >= 2
1703:JlmPack_Rename函数输入的vars->IdList为NULL或vars->IdList_Size == 0或vars->IdList_Size >= 2
1704:JlmPack_Rename函数输入的vars->jlmFile为NULL
1705:JlmPack_Rename函数输入的vars->InByteArray为NULL
1706:JlmPack_Rename函数输入的vars->OutByteArray为NULL
1707:JlmPack_Rename函数输入的vars->RandomBytes为NULL或vars->RandomBytes_size != RANDOM_BYTE_LIMIT
1708:JlmPack_Rename函数输入的vars->IdList[0] == 0,根目录禁止重命名
1709:JlmPack_Rename函数jlmpack为NULL或tmpJlmPack为NULL,内存开辟失败
1710:JlmPack_Rename函数realJlmFilePath为NULL,内存开辟失败
1711:JlmPack_Rename函数realJlmFilePath[i]NULL,内存开辟失败
1712:JlmPack_Rename函数FILE* readfile为NULL
1713:JlmPack_Rename函数FILE* readfile为NULL
1714:JlmPack_Rename函数输入的vars->InByteArray_Size和vars->OutByteArray_Size错误,必须大于等于vars->jlmFile->encryptionWindow + 2097152
1715:JlmPack_Rename函数读取文件失败,读取的长度错误
1716:JlmPack_Rename函数密码或密文错误
1717:JlmPack_Rename函数密码或密文错误
1718:JlmPack_Rename函数重命名无效,名字过长,超过了原来目录所能存放的长度
1719:JlmPack_Delete函数FILE* writefile为NULL
1720:JlmPack_Delete函数写文件失败,写入文件的长度与待写入的长度不一致

1800:JlmPack_BrowseCatalog函数输入的VARIABLES* vars为NULL
1801:JlmPack_BrowseCatalog函数输入的vars->jlmFileUrl为NULL
1802:JlmPack_BrowseCatalog函数输入的vars->IdList为NULL或vars->IdList_Size == 0或vars->IdList_Size >= 2
1803:JlmPack_BrowseCatalog函数输入的vars->jlmFile为NULL
1804:JlmPack_BrowseCatalog函数输入的vars->InByteArray为NULL
1805:JlmPack_BrowseCatalog函数输入的vars->OutByteArray为NULL
1806:JlmPack_BrowseCatalog函数输入的vars->RandomBytes为NULL或vars->RandomBytes_size != RANDOM_BYTE_LIMIT
1807:JlmPack_BrowseCatalog函数jlmpack为NULL或tmpJlmPack为NULL,内存开辟失败
1808:JlmPack_BrowseCatalog函数realJlmFilePath为NULL,内存开辟失败
1809:JlmPack_BrowseCatalog函数realJlmFilePath[i]NULL,内存开辟失败
1810:JlmPack_BrowseCatalog函数FILE* readfile为NULL
1811:JlmPack_BrowseCatalog函数FILE* readfile为NULL
1812:JlmPack_BrowseCatalog函数输入的vars->InByteArray_Size和vars->OutByteArray_Size错误,必须大于等于vars->jlmFile->encryptionWindow + 2097152
1813:JlmPack_BrowseCatalog函数读取文件失败,读取的长度错误
1814:JlmPack_BrowseCatalog函数密码或密文错误
1815:JlmPack_BrowseCatalog函数密码或密文错误
1816:JlmPack_BrowseCatalog函数JLM_CATALOGINFOR* outCatalogs为NULL,内存开辟失败
1817:JlmPack_BrowseCatalog函数outCatalogs->CatalogList为NULL,内存开辟失败

1900:JlmPack_GetLicense函数输入的VARIABLES* vars为NULL
1901:JlmPack_GetLicense函数输入的vars->licenseFilePath为NULL
1902:JlmPack_GetLicense函数输入的vars->license为NULL
1903:JlmPack_GetLicense函数FILE* readfile为NULL,一般是指vars->licenseFilePath路径错误
1904:JlmPack_GetLicense函数vars->licenseFilePath对应的文件错误或无效,或为空

2302:JlmPack_GetLicense函数内存开辟失败
2303:JlmPack_GetLicense函数FILE* readfile为NULL
2304:JlmPack_GetLicense函数证书过期了

2000:JlmPack_GetRule函数输入的VARIABLES* vars为NULL
2001:JlmPack_GetRule函数输入的vars->jlmFileUrl为NULL
2002:JlmPack_GetRule函数输入的vars->jlmFile为NULL
2003:JlmPack_GetRule函数输入的vars->InByteArray为NULL
2004:JlmPack_GetRule函数输入的vars->OutByteArray为NULL
2005:JlmPack_GetRule函数输入的vars->RandomBytes为NULL或vars->RandomBytes_size != RANDOM_BYTE_LIMIT
2006:JlmPack_GetRule函数jlmpack为NULL或tmpJlmPack为NULL,内存开辟失败
2007:JlmPack_GetRule函数realJlmFilePath为NULL,内存开辟失败
2008:JlmPack_GetRule函数realJlmFilePath[i]NULL,内存开辟失败
2009:JlmPack_GetRule函数FILE* readfile为NULL
2010:JlmPack_GetRule函数FILE* readfile为NULL
2011:JlmPack_GetRule函数输入的vars->InByteArray_Size和vars->OutByteArray_Size错误,必须大于等于vars->jlmFile->encryptionWindow + 2097152
2012:JlmPack_GetRule函数读取文件失败,读取的长度错误
2013:JlmPack_GetRule函数密码或密文错误
2014:JlmPack_GetRule函数密码或密文错误

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

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

相关文章

完全入门C语言

1.C语言 C语言是一门通用的计算机编程语言&#xff0c;广泛应用于底层开发。其设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。有良好的跨平台的特性。 同时C语言还是面向过程的编程语言&#xff0c;…

汇编基础语法

指令格式 1、立即数 一个常数&#xff0c;该常数必须对应8位位图&#xff0c;即一个8位的常数通过循环右移偶数位得到该数&#xff0c;该数位合法立即数 在指令中表示方法&#xff1a;#数字&#xff0c;例如&#xff1a;#100 快速判定是否是合法立即数&#xff1a; 首先将这…

一款可以编辑SVG矢量图形的方法(以桑基图为例)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、svg矢量图片在线绘制网站二、保存SVG格式图片二、修改SVG图片中的字体大小一、svg矢量图片在线绘制网站 提示:有些图不想用代码出图时,可以采用这个网站,无需注册,无VIP: 网站地址https…

FFmpeg视频处理工具安装使用

一、前言 FFmpeg是流行的开源视频处理工具&#xff0c;用于转码、合并、编辑等。以下是安装和使用方法&#xff1a; 二、步骤 1.下载 1.1 ffmpeg下载 官网下载地址 wget https://www.ffmpeg.org/releases/ffmpeg-6.1.1.tar.xz1.2 nasm下载 https://www.nasm.us/pub/nasm/…

桥感应加热主电路拓扑结构及控制原

1 桥感应加热主电路拓扑结构及控制原理 1.1 主电路拓扑 本文所述中频感应加热电源采用交—直—交的变频原理&#xff0c;三相50Hz的正弦交流输入电压经过整流滤波为540V平滑直流电压&#xff0c;再经逆变器将直流电压变成不同频率的交流电压供负载使用。本文采用半桥串联谐振…

【echarts】如何关闭dataZoom-silder 组件中数据阴影(缩略图、数据走势图)

echarts开启 “滑动条型数据区域缩放组件&#xff08;dataZoomInside&#xff09;”后&#xff0c;默认会显示数据的走势图。 但有时候我们并不需要。 如何关闭呢&#xff1f; 官方有提供一个属性&#xff1a;showDataShadow https://echarts.apache.org/zh/option.html#da…

无线物联网题集

测试一 未来信息产业的发展在由信息网络向 全面感知和 智能应用两个方向拓展、延伸和突破。 各国均把 物联网作为未来信息化战略的重要内容,融合各种信息技术,突破互联网的限制,将物体接入信息网络。 计算机的出现,开始了第四次工业革命,开始了人机物的高度融合&#xff08;&…

【Unity】 HTFramework框架(五十二)使用 HybridCLR 热更新

更新日期&#xff1a;2024年7月1日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 HybridCLR 热更新一、启用宏定义二、导入HybridCLR三、设置热更新程序集四、资源、代码热更 HybridCLR 热更新 HybridCLR是一个特性完整、零成本、高性能…

探索 ONLYOFFICE 8.1:云端协作的新纪元

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如果对方没做幂等!记一次生产订单重复的反思

最近公司公司的旧系统中发现了一个bug。业务部门反馈&#xff0c;尽管用户只支付了一年的服务费用&#xff0c;系统却将有效期增加了两年。 原因分析&#xff1a; 到底是什么原因呢&#xff1f; 经过日志分析&#xff0c;发现消息队列&#xff08;MQ&#xff09;向第三方服务发…

EDI是什么?与ERP有何关系

EDI的发展过程 电子数据交换&#xff08;Electronic Data Interchange&#xff0c;EDI&#xff09;是一种通过电子方式传输商业文件的技术。EDI的历史可以追溯到20世纪60年代&#xff0c;当时企业开始使用计算机进行数据处理。最早的EDI系统是为解决大型企业间的信息交换问题而…

【刷题汇总--数字统计、两个数组的交集、点击消除(栈)】

C日常刷题积累 今日刷题汇总 - day0011、数字统计1.1、题目1.2、思路1.3、程序实现 2、两个数组的交集2.1、题目2.2、思路2.3、程序实现 3、点击消除(栈)3.1、题目3.2、思路3.3、程序实现 今日刷题汇总 - day001 1、数字统计 1.1、题目 请统计某个给定范围[L, R]的所有整数中…

智能制造企业CRM系统推荐清单(2024版)

当前&#xff0c;CRM市场呈现出“国际龙头优势逐渐下降&#xff0c;国产CRM奋起直追”的格局。智能制造企业在选型CRM时&#xff0c;如何选择合适的系统是一个需要重视的课题。 在我们之前的文章《一文读懂CRM&#xff0c;2023年30家CRM系统对比&#xff08;近年最全&#xf…

如何在AWS上使用免费的服务器

要在AWS上免费使用的服务器&#xff0c;你可以按照以下步骤操作&#xff1a; &#xff08;1&#xff09;注册AWS账户&#xff1a; 访问AWS官方网站&#xff08;https://aws.amazon.com/cn/&#xff09;&#xff0c;点击右上角的“完成注册”&#xff0c;按照页面提示填写相关…

经典小游戏(一)C实现——三子棋

switch(input){case 1:printf("三子棋\n");//这里先测试是否会执行成功break;case 0:printf("退出游戏\n");break;default :printf("选择错误&#xff0c;请重新选择!\n");break;}}while(input);//直到输入的结果为假&#xff0c;循环才会结束} …

基于FreeRTOS+STM32CubeMX+LCD1602+MCP23S09(SPI接口)的I/O扩展器Proteus仿真

一、仿真原理图: 二、运行效果: 三、STM32CubeMX配置: 1)、GPIO配置: 2)、SPI配置: 四、部分软件: 1)、主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : mai…

游戏AI的创造思路-技术基础-关于艾宾浩斯遗忘曲线的迷思

对于艾宾浩斯遗忘曲线和函数&#xff0c;我一直都有小小的迷思&#xff0c;总想实验下用艾宾浩斯函数来替换sigmoid函数作为激活函数&#xff0c;打造更接近人类的AI算法&#xff0c;这篇文章旨在讨论下 目录 3.10. 艾宾浩斯曲线 3.10.1. 定义 3.10.1.1. 曲线计算公式 3.10…

想用AI高端算力训练模型?试试英智BayStone平台

随着生成式人工智能的迅猛增长&#xff0c;各大公司纷纷推出强大的 AI产品以提升自身核心竞争力&#xff0c;对于依赖基础模型进行推理训练&#xff0c;同时需要高级基础设施的人工智能初创企业&#xff0c;急需使用高端智算算力来加速模型训练与产品研发创新。 算力是否充足&…

测试接口的完整流程

背景 今天睿哥给我布置了一个任务&#xff0c;叫我学习一下如何测试接口。 然后我就上网搜索去了解了一下&#xff0c;看看测试接口是什么。看了很久之后&#xff0c;我大概对接口测试有了一定的理解。 通俗来说&#xff0c;接口测试就是使用某种工具模拟客户端发送http请求…

Github 上 Star 数最多的大模型应用基础服务 Dify 深度解读(一)

背景介绍 接触过大模型应用开发的研发同学应该都或多或少地听过 Dify 这个大模型应用基础服务&#xff0c;这个项目自从 2023 年上线以来&#xff0c;截止目前&#xff08;2024-6&#xff09;已经获得了 35k 多的 star&#xff0c;是目前大模型应用基础服务中最热门的项目之一…