如何用C++直接读取压缩包文件中的内容(不解压),哪位能用易懂的语言介绍一下原理,顺便再给出一个算法,谢谢了!

zhangmj10 2012-03-05 03:01:12
如题;
如何用C++直接读取压缩包文件中的内容(不解压),哪位能用易懂的语言介绍一下原理,顺便再给出一个算法,谢谢了!
...全文
2401 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
我记得一款漫画软件可以直接读取压缩包的漫画的 可是我觉得还是得临时解压

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧