文件打包解包的方法

article/2025/9/23 5:40:55

文件打包

前言

在很多情况下,软件需要隐藏一些图片,防止用户对其更改,替换。例如腾讯QQ里面的资源图片,哪怕你用Everything去搜索也搜索不到,那是因为腾讯QQ对这些资源图片进行了打包,当软件运行的时候解包获取资源图片。

举个栗子:

这是我用RDB打包解包工具对QQ某一目录下的.rdb文件进行解包得到的表情包资源,还有头像资源等等。。

这种打包不是压缩包那种经过算法压缩,而是将一堆资源写入到一个文件里面,解包的时候按照打包的方式读取,达到防止用户出于恶趣味更改图片资源。

就好比你在清理内存的时候删除了一些较大的文件,恰巧这个文件就是某游戏的地图资源,导致某游戏地图变成黑色区域。所以就有建议不要乱删电脑里面的任何不确定的文件。

这期介绍下C++利用文件操作进行文件的打包解包..

正文

打包解包


要想将文件打包生成文件,我们需要一张索引表,索引表里面包括关于文件的信息,例如文件名,文件大小..

索引表之后就是文件内容,假设我有四张图片,需要将四张图片打包生成一个.pack包,并且pack包能够被解开获取里面的内容

首先看一下索引表有什么内容

首先是红色区域,占8个字节,存储索引表的信息,索引表的左边是索引表的大小,右边是文件数量

其次是索引表中包含的文件信息,从左到右依次是文件名大小、文件偏移量,文件大小,文件名

文件偏移量:就是资源文件在打包文件中的位置

然后开始关于C++文件操作的打包解包:

#include<iostream>using namespace std;#include <fstream>//索引表大小:4  文件数量:4   文件1大小 文件1偏移  文件1名大小 文件1名  文件2.。。struct FileInfo{  int fileNameSize;  //文件名字大小  int fileOffset;    //文件的偏移量  int fileSize;    //文件的大小  char fileName[20];  //文件名};void packFile(){  FileInfo fileList[4] = {    { 0,0,0,"1.jpg" },    { 0,0,0,"2.jpg" },    { 0,0,0,"3.jpg" },    { 0,0,0,"4.jpg" }  };  fstream file[4];
  int listSize = 0;  //索引表大小  int fileNum = 4;  //文件数量  for (int i = 0; i < 4; i++)  {    fileList[i].fileNameSize = strlen(fileList[i].fileName) + 1;  //1是\0    listSize += fileList[i].fileNameSize + 12;  //求索引表的大小
    file[i].open(fileList[i].fileName, ios_base::in | ios_base::binary);  //打开文件    file[i].seekp(0, ios_base::end);          //读指针移动到末尾    fileList[i].fileSize = file[i].tellp();        //获取文件大小    file[i].seekp(0, ios_base::beg);          //读指针移动到开头  }  //写文件索引信息  fstream outfile("new.pack", ios_base::out | ios_base::binary);  outfile.write((char*)&listSize, 4);  outfile.write((char*)&fileNum, 4);  //写索引表  for (int i = 0; i < 4; i++)  {    if (i == 0)      fileList[i].fileOffset = 8 + listSize;    else      fileList[i].fileOffset = fileList[i - 1].fileOffset + fileList[i - 1].fileSize;
    outfile.write((char*)&fileList[i].fileNameSize, 4);    outfile.write((char*)&fileList[i].fileOffset, 4);    outfile.write((char*)&fileList[i].fileSize, 4);    outfile.write((char*)&fileList[i].fileName, fileList[i].fileNameSize);  }  //写文件  char ch;  for (int i = 0; i < 4; i++)  {    while (ch = file[i].get(),!file[i].eof())    {      outfile.put(ch);    }    file[i].close();  }  outfile.close();}void unPackFile() {  fstream inFile;  inFile.open("new.pack", ios_base::in | ios_base::binary);  int listSize;  //索引表大小  int fileNum;  //文件数量  //读文件索引信息  inFile.read((char*)&listSize, 4);  inFile.read((char*)&fileNum, 4);
  FileInfo* fileList = new FileInfo[fileNum];  fstream *file = new fstream[fileNum];  //读索引表  for (int i = 0; i < fileNum; i++)  {    inFile.read((char*)&fileList[i].fileNameSize, 4);    inFile.read((char*)&fileList[i].fileOffset, 4);    inFile.read((char*)&fileList[i].fileSize, 4);    inFile.read((char*)&fileList[i].fileName, fileList[i].fileNameSize);    file[i].open(fileList[i].fileName, ios_base::out|ios_base::binary);  }    for (int i = 0; i < fileNum; i++)  {    for (int j = 0; j < fileList[i].fileSize; j++)    {      file[i].put(inFile.get());    }    file[i].close();  }  inFile.close();  delete[] fileList;  delete[] file;}int main(){  packFile();  //unPackFile();  return 0;}

工作目录下准备4张用于打包的图片:

运行程序,得到new.pack文件:

删除掉4张jpg图片,只留下new.pack文件:

调用upPackFile函数:

神奇的事情发生了,图片回来了

这只是一个小知识,用的也是熟悉的文件操作,打包的文件不包含文件夹,对于文件夹的打包方式,也是通过遍历文件夹下面的所有文件和文件夹,制作一张索引表,打包到一个文件里面。

 


http://chatgpt.dhexx.cn/article/SUbwATtr.shtml

相关文章

python中拆包解包用法详解

python可以对元组和字典进行拆包或解包操作。 1、拆包&#xff1a;元组 示例代码1&#xff1a; def return_num():return 100, 200num1, num2 return_num() print(num1) # 100 print(num2) # 200运行结果&#xff1a; 示例代码2&#xff1a; def return_num1():return 1…

android-apk解包打包

title: android-apk解包打包 categories: Android tags: [android, 加壳] date: 2022-09-28 10:29:51 comments: false mathjax: true toc: true android-apk解包打包, 以下所有操作都需要在配置好 java 环境下进行 前篇 android apk解包和打包 - https://blog.csdn.net/u0114…

Vue 3 之什么是 解包

Vue 3 之什么是 解包 前言结合代码分析总结 前言 从 Vue2 升到 Vue3 之后,用法上有了很大很大的变化 Vue3可以通过 ref 来声明一些响应式数据,可以是 any 类型的响应式数据 ,在 script 标签中访问和修改这个属性需要用 变量名.value Vue3 3.1 在 template 模板中使用定义的数…

python的解包

解包在英文里叫做 Unpacking&#xff0c;就是将容器里面的元素逐个取出来&#xff08;防杠精&#xff1a;此处描述并不严谨&#xff0c;因为容器中的元素并没有发生改变&#xff09;放在其它地方&#xff0c;好比你老婆去菜市场买了一袋苹果回来分别发给家里的每个成员&#xf…

apk解包+修改源码+重新打包 修改Android端app教程 修改apk文件教程

修改之前一定要先安装java开发环境&#xff0c;不会装的去自行百度。文章较长&#xff0c;耐心阅读。 一直在做Android应用开发&#xff0c;但对于从自己手中输出的apk包&#xff0c;了解并不是很深。最近想研究一下&#xff0c;消除下自己的一些技术盲点。 好吧&#xff0c;…

Python中的解包用法

Python中的解包用法 解包&#xff08;unpacking&#xff1a;解包&#xff0c;拆包&#xff09;&#xff0c;基本意思将容器里面的元素逐个取出来使用。封包&#xff08;packing&#xff1a;封包&#xff0c;打包&#xff09;基本意思将多个元素合起来作为一个整体使用。 可迭代…

SIP协议说明以及报文字段解析

SIP协议的概念&#xff1a; SIP 协议&#xff0c;即 会话初始协议&#xff08;Session Initiation Protocol&#xff09;&#xff0c;是一个应用层的 点对点协议&#xff0c;用于初始、管理和终止网络中的语音和视频会话&#xff0c;是 GB28181 的核心之一。 SIP是一个基于文本…

SIP 协议格式简介

消息体结构&#xff0c;由三部分组成&#xff1a; Request-Line / Status-Line (请求行 / 状态行)Header (消息头)Body (正文) 示例&#xff1a; Request-Line / Status-Line 介绍 Request-Line 格式&#xff1a; MethodRequest-URISIP-VersionCRLFINVITEsip:10011.1.1.1:5060…

会话初始协议---SIP协议【详解】

目录 ​ 一、SIP协议简介 二、SIP消息的两种会话模式 1、Session Model 2、Pager Model 三、SIP消息体格式 1、请求行(request-line) 2、状态行(status-line) 3、消息头 四、SIP消息举例 1、MESSAGE消息&#xff08;Pager Model&#xff09; 2、REGISTER消息 &…

SIP协议-02 原理讲解

文章目录 1 SIP实现机制2 SIP网络元素2.1 用户代理2.2 代理服务器2.3 重定向服务器2.4 位置服务器2.5 注册服务器 3 SIP中的几个重要概念3.1 Messages(消息)3.2 Dialog(对话)3.3 Transaction(事务)3.4 Session(会话) 4 工作流程4.1 登记注册4.2 建立呼叫4.3 重定向呼叫 5 SIP超…

SIP协议(二)

语音编码&#xff0c;语音帧&#xff0c;会议室 &#xff08;1&#xff09;语音编码&#xff0c;语音帧 &#xff08;2&#xff09;补充会议室的抓包 语音编码 现主要有的语音编码有: G.711, G.723, G.726 , G.729, ILBC&#xff0c;QCELP, EVRC, AMR, SMV 各种编解码都有其…

SIP协议解析与实现

SIP协议解析与实现 本文将按照RFC3261逐步的介绍SIP协议,介绍了c和c语言的实现&#xff0c;分析了osip库的使用和实现。 第一章 概述 一 概述 SIP协议是一个基于应用层的会话控制协议。它可以创建、修改、终止多媒体会话(会议)&#xff0c;也可以邀请参与者加入到一个现有的…

SIP协议-01 简介与入门

文章目录 1 介绍1.1 VoIP技术1.2 SIP&#xff08;Session Initiation Protocol&#xff09;1.3 SIP承载1.4 SIP的几个主要标准协议 2 SIP协议栈2.1 PJSIP协议栈2.2 ReSIProcate协议栈2.3 OPAL协议栈2.4 VOCAL协议栈2.5 sipX协议栈2.6 oSIP协议栈 SIP&#xff08;Session Initia…

通信系列2: 深入浅出SIP协议

传统电话是电磁波的通信&#xff0c;当电话技术发展到IP技术时代&#xff0c;SIP协议成为了电话通信标准协议&#xff0c;不仅可以通电话、还可以收发信息、视频、开会、放PPT。事实上&#xff0c;今天的通信业已全面采用SIP协议作为通信标准&#xff0c;无论是固定电话、还是移…

SIP协议简介(一)之SIP基本的概述

本篇文章主要是对RFC3261翻译进行的&#xff0c;也包含着自己的一些理解。希望能给需要的人带来一些帮助 补充说明&#xff1a;RFC即Request For Comments&#xff08;RFC&#xff09;&#xff0c;是一系列以编号排定的文件。文件收集了有关互联网相关信息&#xff0c;以及UNI…

SIP协议(一)

熟悉SIP的一些基本常识概念相关协议&#xff0c; 网络元素&#xff0c;分层结构&#xff0c; 不同请求消息类型&#xff0c;响应消息类型 SDP的一些概念基础 SIP SIP&#xff08;Session Initiation Protocol&#xff09;会话初始化协议&#xff0c;是有IETE&#xff08;I…

SIP协议简介(比较全面)

介绍 通信提供商及其合作伙伴和用户越来越渴求新一代基于 IP 的服务。现在有了 SIP协议&#xff08;会话启动协议&#xff09;&#xff0c;一解燃眉之急。SIP协议 是不到十年前在计算机科学实验室诞生的一个想法。它是第一个适合各种媒体内容而实现多用户会话的协议&#xff0…

【入门篇】SIP 协议详解

本博客转载自&#xff1a;https://xiaxl.blog.csdn.net/article/details/104661248 SIP 协议详解 2013年参与过一个“视频通讯的App”项目&#xff0c;使用Sip协议通信。当时通信协议这块不是自己负责&#xff0c;加上时间紧、任务重等方面的原因&#xff0c;一直未对Sip协议进…

[Appium] Appium自动化测试原理及配置项

Appium自动化测试原理及配置项 一、App自动化测试原理 通过设计自动化脚本&#xff0c;通过发送指令到Appium Server&#xff0c;然后Appium Server转发指定到Android SDK框架来操作被测手机&#xff0c;这个类似于selenium通过浏览器驱动来操作浏览器 Android SDK不同系统不…

Appium 使用

前提是手机易经通过adb连接到电脑 1、打开Appium 点击startServer 2、打开Appium Inspector 填写下面的数据 desired_caps常用参数:platformName 平台的名称&#xff1a;iOS, Android, or FirefoxOSplatformVersion 设备系统版本号deviceName 设备…