国产压缩包工具——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_FILEJLM_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.licenseint 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和linuxsetlocale(LC_ALL, ""); // en_US.UTF-8VARIABLES* 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 = 0vars->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 _WINDOWSprintf("_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";
#endifstrcpy(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、可自定义的结构体一定要把自定义的部分放在结构体的后面。

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

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

相关文章

《昇思25天学习打卡营第4天|数据集 Dataset》

文章目录 前言&#xff1a;今日所学&#xff1a;1. 数据集加载2. 数据集迭代3. 数据集常用操作与自定义数据集 前言&#xff1a; 今天学习的是数据集的内容。首先&#xff0c;数据是深度学习的基石&#xff0c;高质量的数据输入能够在整个深度神经网络中发挥积极作用。MindSpo…

【UE5.1】Chaos物理系统基础——01 创建可被破坏的物体

目录 步骤 一、通过笔刷创建静态网格体 二、破裂静态网格体 三、“统一” 多层级破裂 四、“簇” 群集化的破裂 五、几何体集的材质 六、防止几何体集自动破碎 步骤 一、通过笔刷创建静态网格体 1. 可以在Quixel Bridge中下载两个纹理&#xff0c;用于表示石块的内外纹…

C++中的类型转换操作符:static_cast reinterpret_cast const_cast dynamic_cast

目录​​​​​​​ C语言中的类型转换 C中的类型转换 C中的类型转换操作符 static_cast reinterpret_cast const_cast volatile关键字 赋值兼容 dynamic_cast C语言中的类型转换 基本概念&#xff1a;赋值运算符左右两侧类型不同&#xff0c;或形参与实参类型不匹配…

如何在宝塔面板中配置SSL证书?

目录 一、申请证书二、登录宝塔面板配置SSL证书一、申请证书 登录华为云,进入“云证书管理服务 CCM”: 点击“购买证书”: 选择“DV(Basic)”->“DigiCert”,点击【立即购买】购买有效期为3个月的免费证书。 申请证书:

JAVA里的object类

public static String toString(Object o) // 获取对象的字符串表现形式 public static boolean equals(Object a, Object b) // 比较两个对象是否相等 public static boolean isNull(Object obj) // 判断对象是否为null pu…

基于单片机的 LED 照明灯智能调光系统设计

摘  要&#xff1a; 社会经济的不断发展&#xff0c;推动了智能化生活的进程&#xff0c;智能调光技术开始广泛应用在生活中&#xff0c;人们也逐渐提高了灯光亮灯率等的要求。基于此&#xff0c;笔者主要设计了基于单片机的 LED 照明灯智能调光系统&#xff0c;希望能够为相关…

骨传导耳机哪个牌子好?精选靠谱好用的TOP5骨传导耳机推荐!

在超过八成的音乐爱好者都面临听力健康问题的当下&#xff0c;骨传导耳机因其独特的听觉体验和对听力的保护&#xff0c;在音频设备市场中备受瞩目。但近期我发现不少用户在选购骨传导耳机时常常受到不专业产品的误导。身为有着5年经验的数码博主&#xff0c;在此提醒大家&…

老师怎样用微信发布期末成绩

老师们&#xff0c;期末季又到了&#xff0c;还在为如何发布成绩而头疼&#xff1f;今天&#xff0c;就让我来分享一些小技巧&#xff0c;让你们在微信上发布成绩更加高效&#xff0c;同时又能保护学生的隐私。 首先&#xff0c;我们要确保成绩的安全性和隐私性。在微信上&…

数据恢复篇:如何在 Android 手机上恢复未保存/删除的 Word 文档

在 Android 手机上访问 Word 文档通常很简单&#xff0c;但是当这些重要文件被删除或未保存时会发生什么&#xff1f;这种情况虽然令人痛苦&#xff0c;但并非毫无希望。到 2024 年&#xff0c;有几种强大的方法来处理此类数据丢失。本指南重点介绍如何在Android手机上恢复已删…

Python | Leetcode Python题解之第208题实现Trie(前缀树)

题目&#xff1a; 题解&#xff1a; class Trie:def __init__(self):self.children [None] * 26self.isEnd Falsedef searchPrefix(self, prefix: str) -> "Trie":node selffor ch in prefix:ch ord(ch) - ord("a")if not node.children[ch]:retur…

2008-2022年款哈弗维修手册和电路图线路图接线图资料更新

经过整理&#xff0c;2005-2022年款长城哈弗全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照…

word怎么转换成pdf?分享3种PDF文件转换技巧

word怎么转换成pdf&#xff1f;在日常办公中&#xff0c;将Word转换成PDF可以带来诸多便利。首先&#xff0c;PDF格式具有跨平台的通用性&#xff0c;无论在哪个操作系统或设备上&#xff0c;都能保持文档的原始布局和格式。其次&#xff0c;PDF文件不容易被篡改&#xff0c;可…

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

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

Mac多线程下载管理器:Neat Download Manage 最新版

Neat Download Manager&#xff08;NDM&#xff09;是一款功能强大的下载管理软件&#xff0c;它可以帮助用户更有效地管理和下载网络资源。这款软件支持多种浏览器和协议&#xff0c;可以提升下载速度&#xff0c;恢复中断的下载任务&#xff0c;以及自动化下载过程。在使用任…

如何设置农历日程提醒 农历提醒小妙招

在中国&#xff0c;农历仍然承载着深厚的文化传统和民俗意义。无论是庆祝传统节日&#xff0c;还是纪念亲朋的生日&#xff0c;农历日期都显得格外重要。然而&#xff0c;随着生活节奏的加快&#xff0c;我们有时会因忙碌而遗忘这些特殊的日子。这时&#xff0c;一个能够准确提…

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

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

干货分享:Spring中经常使用的工具类(提示开发效率)

环境&#xff1a;Spring5.3…30 1、资源工具类 ResourceUtils将资源位置解析为文件系统中的文件的实用方法。 读取classpath下文件 File file ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX "logback.xml") ; // ...读取文件系统文件 file Resou…

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

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]的所有整数中…

百事可乐推出具有视频屏幕和人工智能技术的智能罐头

在最近于法国戛纳举行的国际创意节上&#xff0c;百事公司推出了创新的智能罐头。这些罐头不同于传统产品&#xff0c;它们采用了环绕式3D屏幕&#xff0c;能够展示高清视频内容&#xff0c;为品牌宣传和促销带来了全新的视角。经过两年多的精心研发&#xff0c;这些智能罐成为…