社区
C++ 语言
帖子详情
如何用C++直接读取压缩包文件中的内容(不解压),哪位能用易懂的语言介绍一下原理,顺便再给出一个算法,谢谢了!
zhangmj10
2012-03-05 03:01:12
如题;
如何用C++直接读取压缩包文件中的内容(不解压),哪位能用易懂的语言介绍一下原理,顺便再给出一个算法,谢谢了!
...全文
2463
16
打赏
收藏
如何用C++直接读取压缩包文件中的内容(不解压),哪位能用易懂的语言介绍一下原理,顺便再给出一个算法,谢谢了!
如题; 如何用C++直接读取压缩包文件中的内容(不解压),哪位能用易懂的语言介绍一下原理,顺便再给出一个算法,谢谢了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
myiszjf
2013-07-19
打赏
举报
回复
楼主,我也在寻找这方面的资料,也是有这功能需求,有时间可以一起探讨研究啊
yujinhong2012
2012-11-19
打赏
举报
回复
#include "stdafx.h" #include "decode.h" CDecode::CDecode(char *pData,size_t length) { m_index = 0; m_pData = pData; m_length = length; } CDecode::~CDecode() { } CDecode& CDecode::operator >>(bool &value) { size_t size = sizeof(bool); memcpy(&value,m_pData+m_index,size); m_index+=size; return *this; } CDecode& CDecode::operator >>(char &value) { size_t size = sizeof(char); memcpy(&value,m_pData+m_index,size); m_index+=size; return *this; } CDecode& CDecode::operator >>(short &value) { size_t size = sizeof(short); memcpy(&value,m_pData+m_index,size); m_index+=size; return *this; } CDecode& CDecode::operator >>(int &value) { size_t size = sizeof(int); memcpy(&value,m_pData+m_index,size); value = ntohl(value); m_index+=size; return *this; } CDecode& CDecode::operator >>(float &value) { size_t size = sizeof(float); memcpy(&value,m_pData+m_index,size); m_index+=size; return *this; } CDecode& CDecode::operator >>(double &value) { size_t size = sizeof(double); memcpy(&value,m_pData+m_index,size); m_index+=size; return *this; } CDecode& CDecode::operator >>(char *value) { int len; (*this) >>len; memcpy(value,m_pData+m_index,len); value[len] = '\0'; m_index+=len; return *this; } CDecode& CDecode::operator >>(wchar_t &value) { size_t size = sizeof(wchar_t); memcpy(&value,m_pData+m_index,size); value = ntohs(value); m_index+=size; return *this; } CDecode& CDecode::operator >>(wchar_t *value) { int len; (*this)>>len; for(int i=0; i<len; ++i) { *this>>value[i]; } value[len] = '\0'; return *this; } //////////////////////////// #include "stdafx.h" #include "encode.h" CEncode::CEncode(size_t length) { m_pData = new char[length]; memset(m_pData,0,sizeof(char) * length); m_length = length; m_index = 0; } CEncode::~CEncode() { delete[] m_pData; } void CEncode::Resize(size_t length) { // size_t newlen = length+m_index+5; // if (m_length<newlen) // { // char *p = new char[newlen]; // strcpy(p,m_pData); // delete[] m_pData; // m_pData = p; // m_length = newlen; // } } CEncode& CEncode::operator <<(bool value) { size_t size = sizeof(bool); memcpy(&m_pData+m_index,&value,size); m_index+=size; return *this; } CEncode& CEncode::operator <<(char value) { size_t size = sizeof(char); memcpy(m_pData+m_index,&value,size); m_index+=size; return *this; } CEncode& CEncode::operator <<(short value) { size_t size = sizeof(short); memcpy(m_pData+m_index,&value,size); m_index+=size; return *this; } CEncode& CEncode::operator <<(int value) { value = htonl(value); size_t size = sizeof(int); memcpy(m_pData+m_index,&value,size); m_index+=size; return *this; } CEncode& CEncode::operator <<(float value) { size_t size = sizeof(float); memcpy(m_pData+m_index,&value,size); m_index+=size; return *this; } CEncode& CEncode::operator <<(double value) { size_t size = sizeof(double); memcpy(m_pData+m_index,&value,size); m_index+=size; return *this; } CEncode& CEncode::operator <<(const char *value) { int len = strlen(value); (*this) <<len; memcpy(m_pData+m_index,value,len); m_index+=len; return *this; } CEncode& CEncode::operator<<(wchar_t value) { size_t size = sizeof(wchar_t); value = htons(value); memcpy(m_pData+m_index,&value,size); m_index+=size; return *this; } CEncode& CEncode::operator<<(const wchar_t *value) { int len = wcslen(value); //len = 2 * len; //得到的才是字节数.. (*this)<<len; for(int i=0; i<len; ++i) { *this<<value[i]; } return *this; }
zhangmj10
2012-03-05
打赏
举报
回复
[Quote=引用 5 楼 baichi4141 的回复:]
1 了解压缩算法
2 读入文件内容
3 用算法解压缩
4 使用文件
压缩算法有很多很多种
我只实现过一个LZSS算法,这是最简单的算法之一,也很累
如果你没有钻研进去的觉悟,那你还是乖乖解压缩的好
[/Quote]
你的算法能给我参考吗?我的邮箱:zhangmj10@163.com
zhangmj10
2012-03-05
打赏
举报
回复
[Quote=引用 11 楼 baichi4141 的回复:]
我还是那句话,这个问题一点也不简单
“如果你没有钻研进去的觉悟,那你还是乖乖解压缩的好”
顺便,多说一句
为啥非要直接读取而不解压?如果是为了绕过压缩密码那就不用想了。
[/Quote]
我也想直接解压后再。但是现在程序需要这样的功能,直接从zip包里取数据,而不通过压缩(如果每次都去解压的话会变得很麻烦,影响软件的使用)
赵4老师
2012-03-05
打赏
举报
回复
用system函数调用命令行压缩解压软件。
baichi4141
2012-03-05
打赏
举报
回复
我还是那句话,这个问题一点也不简单
“如果你没有钻研进去的觉悟,那你还是乖乖解压缩的好”
顺便,多说一句
为啥非要直接读取而不解压?如果是为了绕过压缩密码那就不用想了。
zhangmj10
2012-03-05
打赏
举报
回复
问题都快被覆盖掉了,回答的人这么少。。。
zhangmj10
2012-03-05
打赏
举报
回复
这个问题不算偏啊,大家来说说哈!
zhangmj10
2012-03-05
打赏
举报
回复
[Quote=引用 7 楼 oldm4n 的回复:]
http://www.info-zip.org/
[/Quote]
....
oldm4n
2012-03-05
打赏
举报
回复
http://www.info-zip.org/
zhangmj10
2012-03-05
打赏
举报
回复
[Quote=引用楼主 zhangmj10 的回复:]
如题;
如何用C++直接读取压缩包文件中的内容(不解压),哪位能用易懂的语言介绍一下原理,顺便再给出一个算法,谢谢了!
[/Quote]
补充:我要读取的文件是zip格式的。。。。
baichi4141
2012-03-05
打赏
举报
回复
1 了解压缩算法
2 读入文件内容
3 用算法解压缩
4 使用文件
压缩算法有很多很多种
我只实现过一个LZSS算法,这是最简单的算法之一,也很累
如果你没有钻研进去的觉悟,那你还是乖乖解压缩的好
oldm4n
2012-03-05
打赏
举报
回复
不同压缩包的压缩算法不同,压缩包的文件结构也不一样,这个不是C++能不能的问题,而是你要找到你需要查看的压缩包类型的开发库,然后写代码调用开发库提供的API对压缩包进行操作
如 zip、gz、bzip2、7z、Z、......
bluewanderer
2012-03-05
打赏
举报
回复
你得用对应你压缩包格式的代码读压缩包,zip文件你得用libz读,rar得用unrarlib读,7z得用7z的库读。而且不是所有压缩包都能流式解压其中一个文件的,比如linux下的各种tar.???
zhangmj10
2012-03-05
打赏
举报
回复
我想,fread()函数不知道可以不可以,一点头绪都没有,不知道怎么办。。。
碎炎
2012-03-05
打赏
举报
回复
我记得一款漫画软件可以直接读取压缩包的漫画的 可是我觉得还是得临时解压
Linux 线程底层
原理
项目,深入探索 Linux 线程的底层
原理
,包括线程创建、同步原语、原子操作、线程池等核心概念
linux_thread_internals/ ├── include/ │ ├── thread_basics.h # 线程基础、生命周期、TLS、栈管理 │ ├── thread_sync.h # 互斥锁、读写锁、条件变量、信号量 │ └── thread_advanced.h # 线程池、Future/Promise、并发模式 ├── src/ │ ├── thread_basics.cpp # 线程基础演示实现 │ ├── thread_sync.cpp # 同步原语演示实现 │ ├── thread_advanced.cpp # 高级主题演示实现 │ └── main.cpp # 主程序入口 (91个模块) ├── examples/ │ ├── thread_basic_example.cpp # 线程基础演示 │ ├── mutex_example.cpp # 互斥锁演示 │ └── condvar_example.cpp # 条件变量演示 ├── docs/ │ └── linux_thread_blog.md # 详细博客文档 ├── CMakeLists.txt └── README.md
Simulink代码生成文档
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 FermentationSim ReadMe by Hyowinner @20151016 run start_interface.m to startup this software, A welcome GUI is displayed for user to choose which mode to enter. Dynamic mode(Simulink model based) and Steady Mode(m script based). Each of the two mode provide a GUI to operate. run dynamic_simulink.m to start Dynamic Fermentation Simulation Software GUI It can load variables and open Simulink models for Simulation. run simulink_control.m to start another GUI with embedded Simulation results plot. It also demostrate the connection between GUI and Simulink and how to transfer data between them. And the three GUI below can call each other smoothly with pushbutton. Much more information about this ...
5_marmalade_bot_rtos-main7-main (4).zip
5_marmalade_bot_rtos-main7-main (4).zip
基于阿里云PolarDB数据库性能大赛的Java实现高性能键值存储引擎-采用多线程并发处理与内存映射
文件
优化技术-通过JNA
直接
I-O与零拷贝技术大幅提升读写吞吐量-支持大规模随机.zip
基于阿里云PolarDB数据库性能大赛的Java实现高性能键值存储引擎_采用多线程并发处理与内存映射
文件
优化技术_通过JNA
直接
I_O与零拷贝技术大幅提升读写吞吐量_支持大规模随机.zip毕业设计课题--网络聊天室(Socket)
开源字体-更纱黑体-常规字体
开源字体-更纱黑体-常规字体
C++ 语言
65,209
社区成员
250,519
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章