分享一下我自己写的代码 任何文件转成TXT可读文本

錦織圭 2013-08-05 07:41:56
我写了一个小程序可以把任何文件转成TXT可读文本,也能无伤地由TXT文本完美转换回来。


可读文本要求ASCII码必须对应成那些字母、符号才可以,所以8个bit的排列组合结果太多,已经不可能与可见可编辑可识别的那些ASCII字符建立单射了。所以我每次只关注4个bit,4个bit的排列组合最多用16个字母就能全部一一对应起来了。只是我的算法很粗糙,没想过更多优化算法,所以这样的后果是一个x大小的文件转成纯txt文件就成了2x的大小了。

最后用的是MFC做的所以程序中有一些明显的只能在MFC用的语句。。



#include <iostream>
#include <fstream>
using namespace std;

static int pand=0;
static long xb=0;

inline int chengfang(int x1,int x2)
{
if (x2==0) return 1;
int x3=(x1);
for(;(x2)>1;(x2)--)
{
x3=x3*x1;
}
return x3;
}

ifstream fin(ar.m_strFileName,ios_base::binary);
CFile quchangdu(ar.m_strFileName,CFile::modeRead|CFile::shareDenyNone);
long n=quchangdu.GetLength();
unsigned long nn;
nn=n*2;
unsigned char *bm=new unsigned char[n];
int *b=new int[nn];
char *kekka=new char[nn];
int *citouzh=new int;

fin.read((char *)bm,n);
for (long qq=0;qq<n;qq++)
{
(*citouzh)=int(bm[qq]);
for(int p=7;p>3;p--)
{
if ((*citouzh)&(chengfang(2,p)))
{
int linshi=1;
pand=pand+(linshi<<(p-4));
}
else continue;
}
if (qq==0) xb=0;
b[xb]=pand;
switch(b[xb])
{
case 0:kekka[xb]='L' ;break;
case 1:kekka[xb]='H' ;break;
case 2:kekka[xb]='U' ;break;
case 3:kekka[xb]='O' ;break;
case 4:kekka[xb]='Z' ;break;
case 5:kekka[xb]='E' ;break;
case 6:kekka[xb]='I' ;break;
case 7:kekka[xb]='K' ;break;
case 8:kekka[xb]='A' ;break;
case 9:kekka[xb]='M' ;break;
case 10:kekka[xb]='N' ;break;
case 11:kekka[xb]='R' ;break;
case 12:kekka[xb]='F' ;break;
case 13:kekka[xb]='D' ;break;
case 14:kekka[xb]='Y' ;break;
case 15:kekka[xb]='T' ;break;
}
xb++;
pand=0;
for(int q=3;q>=0;q--)
{
if ((*citouzh)&(chengfang(2,q)))
{
int linshi=1;
pand=pand+(linshi<<q);
}
else continue;
}
b[xb]=pand;
switch(b[xb])
{
case 0:kekka[xb]='L' ;break;
case 1:kekka[xb]='H' ;break;
case 2:kekka[xb]='U' ;break;
case 3:kekka[xb]='O' ;break;
case 4:kekka[xb]='Z' ;break;
case 5:kekka[xb]='E' ;break;
case 6:kekka[xb]='I' ;break;
case 7:kekka[xb]='K' ;break;
case 8:kekka[xb]='A' ;break;
case 9:kekka[xb]='M' ;break;
case 10:kekka[xb]='N' ;break;
case 11:kekka[xb]='R' ;break;
case 12:kekka[xb]='F' ;break;
case 13:kekka[xb]='D' ;break;
case 14:kekka[xb]='Y' ;break;
case 15:kekka[xb]='T' ;break;
}
xb++;
pand=0;
}
cout<<"\n\n\n";
ofstream fout("D://OUTPUTTXT//kekka.txt",ios_base::out|ios_base::binary);
fout.write((char *)kekka,nn);
delete citouzh;
delete []b;
delete []bm;
delete []kekka;
CString s("Done!");
AfxMessageBox(s);
...全文
330 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rocktyt 2013-08-06
  • 打赏
  • 举报
回复
引用 7 楼 ForestDB 的回复:
base64 可以看看
++ 看完lz的介绍就想说lz可以看一下base64编码
ForestDB 2013-08-06
  • 打赏
  • 举报
回复
base64 可以看看
lpcads 2013-08-06
  • 打赏
  • 举报
回复
看完了,不知我完全看懂没有。那个 else continue 有点意思。 我在想如果用汇编语言怎么写: 0.为避免case过的多,先建立一个字符表 1.读入一个字节存入 byte a中。 2.将a复制到byte b中,将 b 右移四位。 3.将b作为索引查表,存入输出数组。 4.将a 和 0fh 相与,作为索引查表,存入输出数组。 5.重复1,直到读到eof。 6.输出到文件。
tsakang 2013-08-06
  • 打赏
  • 举报
回复
Office这些文档不能转化了吧!
赵4老师 2013-08-06
  • 打赏
  • 举报
回复
void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%04x -",i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
錦織圭 2013-08-05
  • 打赏
  • 举报
回复
引用 3 楼 defonds 的回复:
哦?试试看看如何
嘻嘻没问题的 早就试过很多次了 从MP3文件到二百多M的AMD显卡驱动程序(只不过花的时间那叫一个长) 都能完美转换 其实这个几乎不会出问题的因为我算法实在是太简单了
Defonds 2013-08-05
  • 打赏
  • 举报
回复
哦?试试看看如何
漫步者、 2013-08-05
  • 打赏
  • 举报
回复
汉子可以不?00
max_min_ 2013-08-05
  • 打赏
  • 举报
回复
这么牛掰!

65,210

社区成员

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

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