基于Zlib实现的从ZIP文件中提取文件数据

C++底层实现ZIP解压:Zlib库与ZIP格式解析实战指南 数据压缩是计算机存储与传输中的基础技术,其核心原理是通过算法减少数据的冗余表示。DEFLATE作为广泛使用的无损压缩算法,构成了ZIP、GZIP等格式的基石。在C/C++生态中,Zlib库提供了DEFLATE算法的高效实现,其价值在于为开发者提供了底层的压缩/解压缩能力,是实现自定义压缩工具或处理特定压缩格式(如ZIP文件内部数据块)的关键。在嵌入式系统、游戏资源加载或需要精细控制内存与依赖的桌面应用中,直接使用Zlib处理ZIP文件成为一项重要的工程实践。这要求开发者不仅理解Zlib的API,如`unco 阅读详情




源代码略解

  主要讲下zextract工程好了,其实只是实现了3个函数,并且只有两个还是靠谱的,其中只有一个是实用的。分别是1.『列出压缩包内的文件』,2.『查找压缩包中文件』,3.『获取压缩包内的文件』。第一个明显是玩玩的,因为直接是printf输出到console中,也是参考了minizip中的do_list函数的实现。第二个函数写是写了,但是没啥大用,以玩玩为主。最后一个是有用的东西,实现了从压缩包中读取文件的功能,其中还用到了CMemBuffer类。先看下工程的头文件好了。
  1. // The following ifdef block is the standard way of creating macros which make exporting
  2. // from a DLL simpler. All files within this DLL are compiled with the ZEXTRACT_EXPORTS
  3. // symbol defined on the command line. this symbol should not be defined on any project
  4. // that uses this DLL. This way any other project whose source files include this file see
  5. // ZEXTRACT_API functions as being imported from a DLL, wheras this DLL sees symbols
  6. // defined with this macro as being exported.
  7. #ifdef ZEXTRACT_EXPORTS
  8. #define ZEXTRACT_API __declspec(dllexport)
  9. #else
  10. #define ZEXTRACT_API __declspec(dllimport)
  11. #endif
  12. #include "MemBuffer.h"
  13. #include "luna.hpp"
  14. ZEXTRACT_API void ListZip(constchar* fname);
  15. ZEXTRACT_API bool FindFileInZip(constchar* zfn, constchar* fname);
  16. ZEXTRACT_API int GetFileInZip(CMemBuffer& buffer,const char* zfn,const char* fname,const char* password);
  17. extern "C" ZEXTRACT_APIint luaopen_zextract(lua_State* L);
// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the ZEXTRACT_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// ZEXTRACT_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.
#ifdef ZEXTRACT_EXPORTS
#define ZEXTRACT_API __declspec(dllexport)
#else
#define ZEXTRACT_API __declspec(dllimport)
#endif

#include "MemBuffer.h"

#include "luna.hpp"

ZEXTRACT_API void ListZip(const char* fname);
ZEXTRACT_API bool FindFileInZip(const char* zfn, const char* fname);
ZEXTRACT_API int GetFileInZip(CMemBuffer& buffer, const char* zfn, const char* fname, const char* password);

extern "C" ZEXTRACT_API int luaopen_zextract(lua_State* L);
   讲下 GetFileInZip函数。一共有4个入参:
  1. CMemBuffer对象,用来存储从压缩包中抽取的文件。
  2. 对应的ZIP Archive文件路径,相对路径和绝对路径皆可。
  3. 对应在ZIP Archive中要提取的文件路径。
  4. 密码,如果没有密码则填NULL或者0即可。
  函数返回大于等于0则表示提取的文件的大小,如果返回小于0,则是对应的错误代码。如果执行成功,则文件内容存放在buffer对象中。
  其余两个函数没什么介绍的必要,自己看下源代码即可。

zextract.cpp::GetFileInZip

  1. ZEXTRACT_API int GetFileInZip(CMemBuffer& buffer,const char* zfn,const char* fname,const char* password)
  2. {
  3. unzFile uf = unzOpen(zfn);
  4. if (NULL == uf)
  5. {
  6. printf("unzOpen failed...\n");
  7. return -1;
  8. }
  9. int err = unzLocateFile(uf, fname, 0);
  10. if (UNZ_OK != err)
  11. {
  12. printf("GetFileInZip unzLocateFile failed... error:%d\n");
  13. return err;
  14. }
  15. unz_file_info file_info;
  16. char filename_inzip[256];
  17. err = unzGetCurrentFileInfo(uf, &file_info, filename_inzip,sizeof(filename_inzip), NULL, 0, NULL, 0);
  18. if (UNZ_OK != err)
  19. {
  20. printf("unzGetCurrentFileInfo failed... error:%d\n", err);
  21. return err;
  22. }
  23. err = unzOpenCurrentFilePassword(uf, password);
  24. if (UNZ_OK != err)
  25. {
  26. printf("unzOpenCurrentFilePassword failed... error:%d\n", err);
  27. return err;
  28. }
  29. char* pBuff = newchar[file_info.uncompressed_size];
  30. if (pBuff == NULL)
  31. {
  32. unzCloseCurrentFile(uf);
  33. unzClose(uf);
  34. return -2;
  35. }
  36. err = unzReadCurrentFile(uf, pBuff, file_info.uncompressed_size);
  37. if (err < 0)
  38. {
  39. printf("unzReadCurrentFile failed... error:%d\n", err);
  40. delete [] pBuff;
  41. unzCloseCurrentFile(uf);
  42. unzClose(uf);
  43. return err;
  44. }
  45. // Append data to the MemBuffer
  46. buffer.Append(pBuff, file_info.uncompressed_size);
  47. unzCloseCurrentFile(uf);
  48. unzClose(uf);
  49. return err;
  50. }
ZEXTRACT_API int GetFileInZip(CMemBuffer& buffer, const char* zfn, const char* fname, const char* password)
{
	unzFile uf = unzOpen(zfn);
	
	if (NULL == uf)
	{
		printf("unzOpen failed...\n");
		return -1;
	}
	
	int err = unzLocateFile(uf, fname, 0);
	if (UNZ_OK != err)
	{
		printf("GetFileInZip unzLocateFile failed... error:%d\n");
		return err;
	}
	
	unz_file_info file_info;
	char filename_inzip[256];
	
	err = unzGetCurrentFileInfo(uf, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);

	if (UNZ_OK != err)
	{
		printf("unzGetCurrentFileInfo failed... error:%d\n", err);
		return err;
	}

	err = unzOpenCurrentFilePassword(uf, password);

	if (UNZ_OK != err)
	{
		printf("unzOpenCurrentFilePassword failed... error:%d\n", err);
		return err;
	}

	char* pBuff = new char[file_info.uncompressed_size];

	if (pBuff == NULL)
	{
		unzCloseCurrentFile(uf);
		unzClose(uf);
		return -2;
	}

	err = unzReadCurrentFile(uf, pBuff, file_info.uncompressed_size);

	if (err < 0)
	{
		printf("unzReadCurrentFile failed... error:%d\n", err);
		delete [] pBuff;
		unzCloseCurrentFile(uf);
		unzClose(uf);
		return err;
	}
	// Append data to the MemBuffer
	buffer.Append(pBuff, file_info.uncompressed_size);

	unzCloseCurrentFile(uf);

	unzClose(uf);
	return err;
}
其中关键的操作函数就只有7个:
unzOpen
打开Archive文件
unzClose关闭Archive文件
unzGetCurrentFileInfo获取当前选择的内部压缩文件的信息
unzLocateFile定位文件
unzOpenCurrentFilePassword选择打开当前文件
unzReadCurrentFile读取当前文件
unzCloseCurrentFile关闭当前文件
  其中后三个是需要组合使用的,也就是说需要读取一个内部文件,首先要打开,然后才是读取,最后要关闭。而选择当前文件的方法有很多,这里使用 unzLocateFile函数实现的,如果找到对应文件会把这个文件默认选中为当前文件。 ListZip函数的实现中还有遍历的代码可以参考。

CMemBuffer

  CMemBuffer类其实只是实现了一个存放内存数据的功能。考虑使用一个类专门来存储文件数据是有多方面的考虑,比如文件是二进制的——图片,还有就是获取数据是从堆上申请的内存,要考虑自己释放的问题。自己手动去管理明显会很麻烦,不如专门搞个缓存类来管理这些内存数据块。
  1. // MemBuffer.h: interface for the CMemBuffer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_MEMBUFFER_H__36D0136D_B57A_49FF_855B_E5545078B130__INCLUDED_)
  5. #define AFX_MEMBUFFER_H__36D0136D_B57A_49FF_855B_E5545078B130__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. class CMemBuffer
  10. {
  11. public:
  12. CMemBuffer(int nInitLen = 16);
  13. CMemBuffer(const char* pData,int nLen = 0);
  14. CMemBuffer(const CMemBuffer& buff);
  15. virtual ~CMemBuffer();
  16. public:
  17. virtual int GetBufferLen();
  18. virtual bool Append(constchar* pData, int nLen = 0);
  19. virtual char* GetBuffer();
  20. protected:
  21. bool ReAllocBuffer(int nDeltaLen);
  22. protected:
  23. char* m_pBuffer; // buffer data
  24. int m_nCurLen;
  25. int m_nMaxLen;
  26. };
  27. #endif // !defined(AFX_MEMBUFFER_H__36D0136D_B57A_49FF_855B_E5545078B130__INCLUDED_)
// MemBuffer.h: interface for the CMemBuffer class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MEMBUFFER_H__36D0136D_B57A_49FF_855B_E5545078B130__INCLUDED_)
#define AFX_MEMBUFFER_H__36D0136D_B57A_49FF_855B_E5545078B130__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CMemBuffer  
{
public:
	CMemBuffer(int nInitLen = 16);
	CMemBuffer(const char* pData, int nLen = 0);
	CMemBuffer(const CMemBuffer& buff);
	virtual ~CMemBuffer();

public:
	virtual int GetBufferLen();
	virtual bool Append(const char* pData, int nLen = 0);
	virtual char* GetBuffer();
	
protected:
	bool ReAllocBuffer(int nDeltaLen);

protected:
	char* m_pBuffer;	// buffer data
	int m_nCurLen;
	int m_nMaxLen;
};

#endif // !defined(AFX_MEMBUFFER_H__36D0136D_B57A_49FF_855B_E5545078B130__INCLUDED_)
  这个实现没什么好讲的,拿到数据只要Append即可。要获取数据直接使用 GetBuffer()即可。

Lua导出部分

  1. //////////////////////////////////////////////////////////////////////////
  2. // @Param
  3. // zipName which archive
  4. // fileName which file to extract from the archive named zipName's value
  5. // password password to extract file from zip
  6. // @Return
  7. // binary data
  8. // error number
  9. static int luacf_getFileInZip(lua_State* L)
  10. {
  11. CMemBuffer buff;
  12. const char* pZipName = luaL_checkstring(L, 1);
  13. const char* pFileName = luaL_checkstring(L, 2);
  14. const char* pPassword = lua_tostring(L, 3);
  15. int ret = GetFileInZip(buff, pZipName, pFileName, pPassword);
  16. if (ret >= 0)
  17. {
  18. lua_pushlstring(L, buff.GetBuffer(), buff.GetBufferLen());
  19. return 1;
  20. }
  21. lua_pushnil(L);
  22. lua_pushnumber(L, ret);
  23. return 2;
  24. }
  25. const struct luaL_reg libs[] =
  26. {
  27. {"getFileInZip", luacf_getFileInZip},
  28. {NULL, NULL}
  29. };
  30. ZEXTRACT_API int luaopen_zextract(lua_State* L)
  31. {
  32. luaL_register(L, "zextract", libs);
  33. return 1;
  34. }
//////////////////////////////////////////////////////////////////////////
// @Param
//   zipName   which archive
//   fileName  which file to extract from the archive named zipName's value
//   password  password to extract file from zip
// @Return
//   binary data
//   error number

static int luacf_getFileInZip(lua_State* L)
{
	CMemBuffer buff;
	const char* pZipName = luaL_checkstring(L, 1);
	const char* pFileName = luaL_checkstring(L, 2);
	const char* pPassword = lua_tostring(L, 3);
	int ret = GetFileInZip(buff, pZipName, pFileName, pPassword);

	if (ret >= 0)
	{
		lua_pushlstring(L, buff.GetBuffer(), buff.GetBufferLen());
		return 1;
	}

	lua_pushnil(L);
	lua_pushnumber(L, ret);
	return 2;
}

const struct luaL_reg libs[] =
{
	{"getFileInZip", luacf_getFileInZip},
	{NULL, NULL}
};

ZEXTRACT_API int luaopen_zextract(lua_State* L)
{
	luaL_register(L, "zextract", libs);
	return 1;
}
  这部分就没啥好说了,总之就是这么简单。

Lua测试代码

  1. -- 是否是debug版本
  2. local bDGB = false;
  3. local zlib;
  4. if bDGB then
  5. zlib = package.loadlib("zextract_d.dll", "luaopen_zextract");
  6. if type(zlib) == "function" then
  7. zlib = zlib();
  8. end
  9. else
  10. zlib = require "zextract";
  11. end
  12. if type(zlib) ~= "table" then
  13. print("loadlib error");
  14. return
  15. end
  16. print(zlib.getFileInZip("readme.zip", "folder/readme.txt", "123456"))
-- 是否是debug版本
local bDGB = false;

local zlib;
if bDGB then
	zlib = package.loadlib("zextract_d.dll", "luaopen_zextract");
	if type(zlib) == "function" then
		zlib = zlib();
	end
else
	zlib = require "zextract";
end

if type(zlib) ~= "table" then
	print("loadlib error");
	return
end

print(zlib.getFileInZip("readme.zip", "folder/readme.txt", "123456"))
  
  这里要讲下对应的载入,前面有个debug版本的判断,这个是根据当前编译的版本决定的,当然也可以debug和release版本都编译,名字是不同的,到时候自己手动修改下这个bDGB的标志即可。二进制的文件就不要用这个代码了,因为最后的数据是print出来的,文本的能看下。载入动态库的部分可以看下之前的文章 《Lua脚本调用C++动态库》


目录结构

一共5个文件夹。
zextract文件夹内为动态库的工程目录。
zlibTest目录为C++调用zextract生成动态库的工程文件。
lib目录为对应的库文件的目录,其中有Zlib的库文件以及zextract动态库生成的库文件。
comm文件为一些公共文件存放区,比如minizip的实现源码,还有内存buffer的实现源码。
bin目录为程序的输出目录,内涵一个lua解析器,lua5.1.dll,zlib1.dll,还有个压缩包的例子readme.zip。还有一个lua文件,测试导出库用的。
zlib minizip 实现解压zip #include #include #include "unzip.h" #define dir_delimter '/' #define MAX_FILENAME 512 #define READ_SIZE 8192 int main( int argc, char **argv ) { if ( argc < 2 ) { printf( "usage: 阅读详情

相关推荐

zlib-v1.3.1:递归压缩、解压文件

ZLIB和MiniZip简介与应用 ZLIB是一个通用的开源压缩库,采用deflate算法(结合LZ77和Huffman编码)实现高效数据压缩,广泛应用于存储优化和网络传输。MiniZip是基于ZLIB的轻量级ZIP文件处理库,支持ZIP文件创建、读取和修改,特别适合嵌入式系统和小型应用。两库均采用宽松的开源许可,提供C语言接口并支持跨平台使用。文中还介绍了Windows环境下ZLIB的编译方法,以及使用Qt开发简单的ZIP压缩/解压GUI程序的基本框架。

qq_43441284的博客 3583

zlib 提取 源代码 c语言,基于Zlib实现的从ZIP文件中提取文件数据

ZEXTRACT_APIintGetFileInZip(CMemBuffer& buffer,constchar* zfn,constchar* fname,constchar* password){unzFile uf = unzOpen(zfn);if(NULL == uf){printf("unzOpen failed...\n");return-1;}interr = unzLoc...

weixin_36465073的博客 546

C++ 使用ZLIB库中的MiniZip实现目录压缩与解压

C++ 使用ZLIB库中的MiniZip实现目录压缩与解压

森明帮大于黑虎帮的博客 5454

Linux C语言 Zlib 实现解压zip文件

Linux C语言 实现解压zip文件 因为在做嵌入式Linux,做OTA功能的时候需要加压zip升级包。所以需要用到zip文件的解压缩功能。 就想着能不能用zlib来完成这个功能。在网上一通找以后,发现教程千篇一律,要么是打着解压文件的标题解压buff内容,要么是c++完成的。好不容易有两篇C语言解压缩文件的,结果并不能用。 最后还是只能看英文文档,终于找到案例了。下面记录如何实现的,其实还是非常的简单,例程写得比较复杂,我只用到一个解压功能,我基本上取了一部分代码,没有太大改动。有需要的话,可以再进行精

duapple的博客 9114

Zlib在C++中实现ZIP文件解压缩

Zlib是一个广泛使用的数据压缩库,最初由Jean-loup Gailly和Mark Adler于1995年编写,基于由Paul G. Howard开发的DEFLATE算法。它旨在为应用程序提供一个稳定的,跨平台的压缩库,用于数据流的压缩和解压功能。自发布以来,Zlib已经成为了各种软件系统中不可或缺的一部分,特别是在网络数据传输、文件压缩、多媒体编码等领域得到了广泛应用。

weixin_42510201的博客 700

使用Zlib完成取ZIP压缩包中文件

参考Zlib库(1.2.3)中的Contrib带的minizip程序,用VC6.0实现了从zip文件中读取文件到内存的功能。zextract动态库兼容lua直接调用。

zlib使用:minizlib库编译配置及文件夹压缩

minizlib库编译配置及文件夹压缩/解压缩

cuizongshuai的博客 1679

告别命令行恐惧!用nTopology可视化工具5分钟搞定三维Voronoi泡沫建模

本文介绍如何利用nTopology可视化工具快速生成三维Voronoi泡沫结构,无需编程即可完成复杂建模。Voronoi结构在轻量化设计、能量吸收和生物医学等领域具有重要应用,传统命令行方法门槛较高。通过nTopology的四步流程,用户可在5分钟内创建仿真就绪模型,大幅提升设计效率。

weixin_30764771的博客 427

使用zlib解压标准zip文件

zlib库可以解压zip压缩数据,但是在做标准zip文件解压的时候发现会出现问题,原因其实是因为zlib的压缩格式与标准zip的压缩格式有那么一点区别,最初这个问题让我很纠结,在经过实验后,我将标准zip压缩的文件与使用zlib库函数压缩的文件使用二进制编辑器打开时发现了它们的一点点区别,使用zlib库函数压缩后的数据与标准zip压缩后的数据相比在头部多了个0x9c78,(而且数据的尾部也稍有不同

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 4707

【WSL】window11 安装WSL2配置conda环境及mlatom环境搭建

写这篇文章之前自己安装过两次环境,可能每次都会产生碰到同样的问题,为了搭建适合自己的虚拟环境保证每一步的正确性,按顺序记录一下。

wangxiancao的博客 1629

MATLAB实战:用ARMAX模型搞定电力系统惯量评估(附完整代码)

本文详细介绍了如何利用MATLAB中的ARMAX模型进行电力系统惯量评估,解决新能源占比提高带来的系统惯量下降问题。通过系统辨识技术,从电网运行数据中准确提取惯量参数,并提供完整的代码实现,帮助工程师快速应用于实际工程。

peach的博客 637

zlib

选用的第三方库是很出名的zlib,官方网站为 www.zlib.net。        zlib提供了两个很傻瓜的接口:          int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,                                                    const Bytef *sourc

microsoftwin32的专栏 2948

OpenClaw实战系列02:企业微信接入完全指南

本文详细介绍了如何将OpenClaw与企业微信对接,实现智能机器人功能。主要内容包括:企业微信侧创建智能机器人或自建应用,获取必要凭证和权限;OpenClaw侧安装配置企业微信插件,设置通信通道;完成双向验证并进行功能测试。文章提供了详细的配置步骤、常见问题排查方法和进阶玩法,帮助用户在30分钟内完成对接。关键点包括:确保URL可访问、Token一致、网关正常运行,以及针对不同部署环境(云服务器/内网)的配置差异。

PeterPan的博客 3812

使用 ZLib 压缩/解压 ZIP 文件

实际应用中有时候会遇到需要处理 ZIP 压缩解压的情况,这时候我们有大概三种选择: 调用 rar.exe, unzip.exe 等 使用某现成库 完全手写 第一种虽然能完成任务,但是没法知晓结果。曾经有人对说,可以抓命令行输出结果来判断……这种依靠界面文字来进行精确判断的行为个人认为相当不靠谱。第三种,既然我是个“造轮主义”者,当然说好,但是现在我不了解 ZIP 格式,也不了解 ZIP 算

董盼山的专栏 1万+

[SV]SystemVerilog状态机实现案例

本文介绍了SystemVerilog中状态机的实现方法。首先使用枚举类型定义状态(TOP_HIB、TOP_BG、TOP_LDO、TOP_NOR),然后通过三个主要任务实现状态机:1)格式化现态寄存器处理状态转换;2)描述状态转移条件,包括计时器和稳定时间判断;3)基于当前状态和输入信号确定次态。状态机在时钟边沿或复位时更新状态,实现了从休眠到正常工作状态的转换逻辑,包含电源稳定时间检测等关键功能。

元直的博客 2021

图解电动汽车:电动汽车主要参数

动力性指标 汽车的动力性指标主要有最高车速、加速时间、最大爬坡等,体现了汽车在行驶过程中能达到的极限运动水平。对于电动汽车,其动力性由搭载的驱动电动机决定,主要的参数包括最大扭矩、额定功率、最大功率、最大转速等。 功率是指物体在单位时间内所做的功的多少,是描述做功快慢的物理量,单位是 kW。 扭矩是指机械元件转动的力矩,也称转矩,表示转动力量的大小,单位是 N·m。 转速是指发动机/电动机的转速,的单位是 rpm,即转每分钟。额定转速是指在额定功率下电动机的转速,最大转速则是在最大功率下电动机的转速。

程序员「阿基米东」的编程之旅 2万+

Zlib库的使用实现对zip文件的解压缩

实习项目中涉及到获取GigEVision设备的XML设备描述文件 A GigE Vision device MUST have an XML device description with the syntax described in the GenApi module of the GenICam standard. XML文件有两种形式:压缩的(.zip)XML文件,和未压缩的(.xm

ljh0302的专栏 1万+

Coze 上 OpenClaw 完整使用攻略(零代码 + 24 小时在线 + 飞书 / 微信接入)

Coze(扣子)是目前国内零门槛部署 OpenClaw 最友好的平台,无需服务器、不用命令行,5 分钟即可拥有可执行本地 / 云端任务的 AI 助手,还能一键发布到飞书、微信、钉钉等 IM。

hy行者勇哥的博客 2923

使用ZLib 压缩/解压缩 zip文件

实际应用中有时候会遇到需要处理 ZIP 压缩解压的情况,这时候我们有大概三种选择:调用 rar.exe, unzip.exe 等使用某现成库完全手写第一种虽然能完成任务,但是没法知晓结果。曾经有人对说,可以抓命令行输出结果来判断……这种依靠界面文字来进行精确判断的行为个人认为相当不靠谱。第三种,既然我是个“造轮主义”者,当然说好,但是现在我不了解 ZIP 格式,也不了解 ZIP 算法,所以这个日后再说。今天我们就来切切实实地用一次轮子。ZIP 相关的库中比较有名的可能就是 ZLib 和 InfoZip(un

风声世界的专栏 1万+

YOLOv5 实现 10 种热力图可视化方式教程 | GradCAM XGradCAM ScoreCAM LayerCAM HiResCAM EigenCAM....

基于梯度计算类激活图,是最经典的热力图生成方法之一。Grad-CAM的改进版,通过引入梯度加权的方式,提高了热力图的定位精度。基于类别的得分计算类激活图,对噪声具有更强的鲁棒性。基于特定层的特征图计算类激活图,可以灵活选择不同的层进行分析。通过上采样将低分辨率的特征图恢复到原始图像大小,提高了热力图的分辨率。基于特征图的特征向量进行PCA降维,得到更简洁的热力图。对Grad-CAM的进一步改进,通过加权平均的方式,提高了热力图的质量。基于积分梯度的方法,可以解释模型对输入的每个特征的贡献。

weixin_39818775的博客 2374

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

gzip zip 和zlib

zlib

okadler0518的专栏 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

c语言zlib解压zip文件夹,使用zlib解压.apk/.zip文件(WindowsUbuntu)

前面讲过,解压出apk文件的内容是进行apk分析的第一步,而.apk文件其实就是.zip文件。也就是说首先要实现zip文件的解压缩。本文将分别介绍在Windows和Ubuntu下如何使用zlib这一开源库对zip文件进行解压。ZLIBzlib is designed to be a free, general-purpose, legally unencumbered – that is, not...

weixin_39789792的博客 2052

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

VC中使用zlib压缩目录结构生成zip文件

使用zlib将文件夹压缩成zip文件时,需要自己读取文件然后写入zip文件。利用官方下载的zlib包中包含的contrib/minizip/zip.h和zip.c代码提供的函数,可以很容易实现这个功能。

MulinB的技术博客 1万+

zlib、libz、gzip和zip基础介绍

文章目录基本概念C或C++调用libz函数压缩和解压问题 基本概念 zlib:zlib是提供数据压缩用的函式库(源码包),由Jean-loup Gailly与Mark Adler所开发。源码下载地址:http://www.zlib.net/ libz:是编译或者交叉编译生成的函数库,名称为libz.a和libz.so (linux下) zip:ZIP文件格式是一种数据压缩和文档储存的文件格式。 gzip:最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。 DEFL

mayue_web的博客 1万+
上一篇: spawn-fcgi与PHP-FPM
下一篇: Apache/Tomcat/JBOSS/Nginx区别
云端的蜗牛
博客等级 码龄13年 3粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值