解密文件后出现乱码

naixian1983 2008-08-07 02:29:50
今天早上发一个关于把加密文件解密后读入内存然后显示出来的贴子,以解决一半问题。原贴如下

http://topic.csdn.net/u/20080807/10/b51bf5db-e0b0-4fdf-b236-9f902d2b50b0.html

但现在还有一半问题未解决
当我解密文件显示出来后

原来文件内是这样的

1=D:\HOOK2\TaskBarDll\weigh and size.xls
2=D:\HOOK2\weigh and size.xls


但解密后却变成这样

1=D:烫烫烫烫烫烫K_\HOOK2\TaskBarDl烫烫烫烫烫烫K_l\weigh and size烫烫烫烫烫烫K_.xls
2=D:\HOOK2烫烫烫烫烫烫K_\weigh and size.烫烫烫烫烫烫K_xls

每16个字符后就会出现”烫“,是因为"\0"吗?如何解决?




CString str3,Addstr;
unsigned char ouBuff[25];

long blocknum=lFileLen/16;

Aes aes(16,(unsigned char*)(LPCTSTR)m_DeKey);
for(long i=0;i<blocknum;i++)
{
fread(inBuff,1,16,finput);
aes.InvCipher(inBuff,ouBuff);
// fwrite(ouBuff,1,16,foutput);

str3=ouBuff;
Addstr+=str3;

}

m_rich.SetWindowText(Addstr);



就差那么一点了,解决问题后,两个贴一起结了
...全文
639 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
naixian1983 2008-08-07
  • 打赏
  • 举报
回复
to cnzdgs

当new了一块内存后,如何把ouBuff写入内存,再从内存内读出?可以讲详细点吗?
greatws 2008-08-07
  • 打赏
  • 举报
回复
烫就是0xcccc,而0xcc在汇编就是int 3,中断指令,初始化字符数组变量的时候,如果没有要求,编译器就会以0xcc来填充,执行的时候,如果越界了,会自动触发中断

你要么根据长度在最后一个字节加上'\0',要么每次执行完str3=ouBuff;,都memset它为0
schlafenhamster 2008-08-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cnzdgs 的回复:]
doc不是纯文本文件,所以不能当成字符串来处理。
[/Quote]
schlafenhamster 2008-08-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
就是\0的问题,字符串以\0为结尾,你解密后的数据最后是没有\0的,在当作字符串处理的时候就会把后面的无效数据也加上,直到遇到\0位置,你可以在InvCipher之后加一行代码:
ouBuff[16] = 0;让CString知道数据在这里结尾。
[/Quote]
cnzdgs 2008-08-07
  • 打赏
  • 举报
回复
doc不是纯文本文件,所以不能当成字符串来处理。
naixian1983 2008-08-07
  • 打赏
  • 举报
回复
在.doc文件中,不管最上面的那一行是否有字符,都会出现一样的乱码,当中间部分解出来后,最后一行明明是没有任何字符的,但却出现乱码
cnzdgs 2008-08-07
  • 打赏
  • 举报
回复
你用字符串来处理只能处理纯文本文件,如果处理其它类型的文件不要用CString。建议你根据文件大小来new一块内存,另外用一个PBYTE指针表示当前处理到的位置,将此指针作为InvCipher的第2参数,每次加16。

ouBuff[16] = 0就是给数据最后加一个\0,让CString知道数据在这里结尾。
naixian1983 2008-08-07
  • 打赏
  • 举报
回复
to cnzdgz

你真是神啊!
现在解密后的txt文件可以显示出来了,但.doc文件还有一点错误。文件解出来后,最所上面的一行和最下面的一行都会乱码,只有中间部分给解出来了,为什么会这样?怎样解决呢?

还有你上面的ouBuff[16] = 0;为什么加上后就解决问题呢?是什么意思?
scq2099yt 2008-08-07
  • 打赏
  • 举报
回复
就是\0的问题,字符串以\0为结尾,你解密后的数据最后是没有\0的,在当作字符串处理的时候就会把后面的无效数据也加上,直到遇到\0位置,你可以在InvCipher之后加一行代码:
ouBuff[16] = 0;
fred_fu 2008-08-07
  • 打赏
  • 举报
回复
yes , the same as 1st floor.
cnzdgs 2008-08-07
  • 打赏
  • 举报
回复
就是\0的问题,字符串以\0为结尾,你解密后的数据最后是没有\0的,在当作字符串处理的时候就会把后面的无效数据也加上,直到遇到\0位置,你可以在InvCipher之后加一行代码:
ouBuff[16] = 0;

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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