首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

郁闷天天有,今天特别多。望牛人来解惑~解决方法

2012-03-09 
郁闷天天有,今天特别多。。。望牛人来解惑~对字符串xor加密的几点疑惑。。详细问题见程序注释OptionExplicitOpt

郁闷天天有,今天特别多。。。望牛人来解惑~
对字符串xor加密的几点疑惑。。详细问题见程序注释Option   Explicit
Option   Base   1
Private   Sub   set_Click()
Dim   arr()
Dim   i   As   Long,   k   As   Long
Dim   ss   As   String,   txts   As   String

If   Len(Text1.Text)   =   0   Then   Exit   Sub   '   检测文本框

ss   =   "d:\arr.txt "   '加密字符存放的文件

If   Dir(ss)   <>   " "   Then   Kill   ss   '如果加密文件存在就删除

txts   =   Text1.Text
k   =   Len(txts)

For   i   =   1   To   k
    ReDim   Preserve   arr(i)
      arr(i)   =   Mid$(txts,   i,   1)
arr(i)   =   Asc(arr(i))   Xor   256   '取出字符串,进行简单的异或
Next

Open   ss   For   Binary   As   #1
    Put   #1,   ,   arr()     '把加密后的字符串写入文件????《1》为什么:加密文件大小=   (字符串大小)x4+4
Close   #1
MsgBox   "   yes! "

ReDim   arr(1)


End   Sub

Private   Sub   get_Click()
Dim   arr(),   brr()
Dim   i   As   Long,   k   As   Long
Dim   ss   As   String,   sss   As   String

ss   =   "d:\brr.txt "
sss   =   "d:\arr.txt "

    If   Dir(sss)   =   " "   Then   Exit   Sub

    If   Dir(ss)   <>   " "   Then   Kill   ss

k   =   FileLen( "d:\arr.txt ")
Open   sss   For   Binary   As   #2
    ReDim   Preserve   arr(k)
    Get   #2,   ,   arr()   '取出文件中的数据
Close   #2

For   i   =   1   To   UBound(arr)
ReDim   Preserve   brr(i)
arr(i)   =   arr(i)   Xor   256     '对数据解密
brr(i)   =   Chr(arr(i))   '转换为字符
Next

Open   ss   For   Binary   As   #3   '《2》中文的字符都能解密,但是E文有些反而不能,为什么???
    Put   #3,   ,   brr()     '   如果加密为全中文,解密文件大小=加密文件x5+17字节
Close   #3                         '《3》如果加密为全英文,解密文件大小=加密文件x5     ????这又是为什么?
MsgBox   "yes! "
ReDim   arr(1):   ReDim   brr(1)

End   Sub

[解决办法]
StrConv一下?
[解决办法]
你从哪里找来的代码?

这样的代码没法看,算法部分先不说,ReDim arr(1)这样的用法尤其笨拙,事实上用
Erase arr即可释放数组占用的资源
[解决办法]
正确的做法是:
先用StrConv将字串转为byte数组,然后xor,最后写入文件
[解决办法]
所以建议txts = Text1.Text '这里把汉字等字符都转为BYTE,这样不管怎么疑惑都不会超过256
k = Len(txts)


arr(i) = Asc(arr(i)) Xor 256 要是存在汉字就够了,!!
呵呵,汉字的ASCiI就不是0 - 255 了哦!
[解决办法]
//即使默认数组是用variant的4个字节来存贮元素的,为什么加密文件大小会多出4个字节。

不知你的结论从何而来?我测试的结果是无论是中文还是英文,加密文件的大小就是字串的长度*4,我的系统xp sp2,vb6 sp6.



//还有一个问题,,,filelen(file)和lof(file)文件大小里面包含了文件头信息吗。。。?

包含,指的就是文件的整个大小

//为什么我用byte复制的时候,能够把文件无损(这个里面肯定是包含了文件格式信息的)的全部复制过去。。string*1就会损坏呢??

//为什么我用byte复制的时候,能够把文件无损(这个里面肯定是包含了文件格式信息的)的全部复制过去。。string*1就会损坏呢??

算法的问题,加密后文件内容不再是纯文本,所以定义为string强制转换后会丢失内容


[解决办法]
//到底丢失了哪一部分内容

不是string的部分,在强制转换成string后,全部丢失了
[解决办法]
显然,要 XOR、AND 类型的运算,应该用 BYTE ,而不是 STRING

热点排行