求教!VFP 9.0 sp2中CHRTRAN函数的转换问题

jarkar 2013-05-16 01:01:34
变量body为一组字符集,如:"1234567890abcdefg......" 约有200个字符组成
变量rabb为body向反排列的字符集".....gfedcba0987654321" 约有200个字符组成

然后我做了如下操作
abc1=CHRTRAN("国际域名",body,rabb)
abc2=CHRTRAN("域名",body,rabb)
? abc1
? abc2

*显示结果为:
e褛F撳 &&为abc1值
贔撳 &&为abc2值

问题是abc1最后四位字符应该和abc2值一样,但我这里显示去不一样,不知道是什么问题产生的.

另外在把abc1,abc2等类似用CHRTRAN转换过的字符放到sql 2005的select查询上后,有些字符在转递到sql后LIKE操作变成了where XXXX LIKE '%n奷馎?',少了一个%操作符,正确的应该是 where XXXX LIKE '%n奷馎?%',不知道为什么,求高手解答!
...全文
386 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
WWWWA 2013-05-20
  • 打赏
  • 举报
回复
你的表放SQLSERVER2005上?你可以将要加密的数据单独放在1个表中, 通过ID连接查询,可以设置此表的访问权限。
WWWWA 2013-05-20
  • 打赏
  • 举报
回复
引用 17 楼 jarkar 的回复:
[quote=引用 16 楼 apple_8180 的回复:] 要是加密后,还能看出来cStr1的内容与cStr2的内容有相同,那加密就没有意义了,就可以容易解密了,或者说就不能加密码了。 应该解密后再比对。
这样的话加密后的数据查询就麻烦了,因为用户输入的字符肯定与加密后的数据不一样 想知道高手们怎么查询加密后的数据资料[/quote]  肯定先解密才能查询,一般是先将此字段COPY到服务器的临时表中,再用 程序(代码)解密,(在原来做工资系统时,有1个DECDBF.EXE、SECDBF.EXE文件 专门加、解密,解密) 你的数据有几百万,这个方法不适用。
jarkar 2013-05-20
  • 打赏
  • 举报
回复
引用 18 楼 apple_8180 的回复:
应该是这样吧: 存储时:将数据加密后存储。 查询时:将输入的数据加密后再与存储的数据对比,或者将存储的数据解密后与输入的未加密的数据对比。 我的操作员密码是这样: 存储时:将数据加密后存储。 对比操作员密码时,用视图将所有操作员取到本地为临时表,然后选择或输入操作员(这里操作员临时表定位到对应的操作员了),最后将输入的密码加密后与表中原来加密后存储的密码进行比对。
谢谢版主,不过这种办法处理小数据还是可以的实用的,如果数据在几百万以上的话查询就麻烦了
十豆三 2013-05-20
  • 打赏
  • 举报
回复
应该是这样吧: 存储时:将数据加密后存储。 查询时:将输入的数据加密后再与存储的数据对比,或者将存储的数据解密后与输入的未加密的数据对比。 我的操作员密码是这样: 存储时:将数据加密后存储。 对比操作员密码时,用视图将所有操作员取到本地为临时表,然后选择或输入操作员(这里操作员临时表定位到对应的操作员了),最后将输入的密码加密后与表中原来加密后存储的密码进行比对。
jarkar 2013-05-18
  • 打赏
  • 举报
回复
引用 16 楼 apple_8180 的回复:
要是加密后,还能看出来cStr1的内容与cStr2的内容有相同,那加密就没有意义了,就可以容易解密了,或者说就不能加密码了。 应该解密后再比对。
这样的话加密后的数据查询就麻烦了,因为用户输入的字符肯定与加密后的数据不一样 想知道高手们怎么查询加密后的数据资料
jarkar 2013-05-17
  • 打赏
  • 举报
回复
求字符固定加密的办法!
jarkar 2013-05-17
  • 打赏
  • 举报
回复
引用 10 楼 apple_8180 的回复:
你看一下 body 和 rabb,好像rabb并不是body的反排序。
body和rabb的取值是按这样得来的 FOR i=1 TO 200 body=body+CHR(i) rabb=rabb+CHR(201-i) ENDFOR 做chrtran的转换目的是为了加密等长度的字符,但是有些加密的字符会变化,比如"国际域名"和"域名",出来的chrtran转换"域名"字符是不一样的
十豆三 2013-05-17
  • 打赏
  • 举报
回复
你看一下 body 和 rabb,好像rabb并不是body的反排序。
十豆三 2013-05-17
  • 打赏
  • 举报
回复
body,rabb有可能正常前后组合时正常组成了一个汉字,因为汉字是双字节,所以 CHRTRAN 时会因为长度不同而有舍去,也就是说不能用 CHRTRAN 对双字节操作。 举个例子: body='123ABC' rabb='CBA321' 基中 BA 正好组成了1个汉字,这个实际值就成了 rabb='C'+1个汉字+'321',并不是body的反排序。
WWWWA 2013-05-17
  • 打赏
  • 举报
回复
body="" rabb="" FOR i=1 TO 200 body=body+CHR(i) rabb=rabb+CHR(201-i) ENDFOR ?body ?rabb abc1=CHRTRANc("国际域名",body,rabb) abc2=CHRTRANc("域名",body,rabb) ? abc1 ? abc2
十豆三 2013-05-17
  • 打赏
  • 举报
回复
要是加密后,还能看出来cStr1的内容与cStr2的内容有相同,那加密就没有意义了,就可以容易解密了,或者说就不能加密码了。 应该解密后再比对。
jarkar 2013-05-17
  • 打赏
  • 举报
回复
谢谢十豆三资料提供,我用myfll测试了一下: Set Library To myFll cStr1="国际域名" cStr2="域名" cKey="myKey" cEnStr1=EnDeString(cStr1,cKey) &&执行加密 ?cEnStr1 cEnStr2=EnDeString(cStr2,cKey) &&执行加密 ?cEnStr2 ? cEnStr2 $ cEnStr1 Set Library To 结果显示: 詟瘼畝缉 緢帗 .F. 我在想为什么2个"域名"字符的加密结果不一样呀!这样select ..... where 就查不到了,比如要查所有包含“域名”的记录,就会有很多记录查不到~
十豆三 2013-05-17
  • 打赏
  • 举报
回复
<木瓜的MyFll.fll(1.187.10.803)及说明> http://www.access911.net/CSDN/FileDescription.asp?mdb=2012-11-10&id=10 <木瓜的MyFll.fll(1.182.10.526)及说明> http://download.csdn.net/source/2505656
十豆三 2013-05-17
  • 打赏
  • 举报
回复
推荐用 木瓜大侠的 MyFll.fll 中的加密函数
jarkar 2013-05-16
  • 打赏
  • 举报
回复
body="" rabb="" FOR i=1 TO 200 body=body+CHR(i) rabb=rabb+CHR(201-i) ENDFOR 以上是编码的方式,可能chr中i变量的排列与实际程序不一样,但body和rabb字符集编码原理是一样的,只是字符排列上有不同 之后用 abc1=CHRTRAN("国际域名",body,rabb) abc2=CHRTRAN("域名",body,rabb) ? abc1 ? abc2 显示的abc1最后四位字符应该和abc2值一样,但我这里显示去不一样,不知道是什么问题产生的.
十豆三 2013-05-16
  • 打赏
  • 举报
回复
没明白你的意思。 以这个为例 a=[123456abcdefg] b=[gfedcba654321] c=[1a2b3c4d5e6fg] ?Chrtran(c,a,b) ?Chrtran(c,b,a) 你想要什么结果?
wwwwb 2013-05-16
  • 打赏
  • 举报
回复
VFP不支持UTF8,检查一下SQLSERVER2005的字符集 有双字节的用CHRTRANC
lygcw9602 2013-05-16
  • 打赏
  • 举报
回复
上传你的三个字符集
jarkar 2013-05-16
  • 打赏
  • 举报
回复
a=[123456abcdefg] b=[gfedcba654321] c=[1a2b3c4d5e6fg] ?CHRTRANC(c,a,b) ?CHRTRANC(c,b,a) 结果好像值是一样的,我希望值正好相反
引用 1 楼 lygcw9602 的回复:
Visual FoxPro 9.0 语言参考 
CHRTRANC( ) 函数 
将第一个字符表达式中与第二个表达式的字符相匹配的字符替换为第三个表达式中相应的字符。
CHRTRANC(cSearched, cSearchFor, cReplacement)
参数
cSearched:指定表达式,CHRTRANC( ) 对其中的字符进行替换。 
cSearchFor:指定表达式,CHRTRANC( ) 在 cSearched 中查找此表达式。 
cReplacement:指定包含替换字符的表达式。
若在 cSearched 中发现一个 cSearchFor 中的字符,则在 cSearched 中的字符用 cReplacement 中的一个字符替换。替换字符在 cReplacement 中的位置与被替换字符在 cSearchFor 中的位置相同。
若 cReplacement 中的字符比 cSearchFor 中的字符少,则删除 cSearchFor 中多余的字符。若 cReplacement 中的字符比 cSearchFor 中的字符多,则忽略 cReplacement 中多余的字符。 
返回值:字符型
说明
CHRTRANC( ) 是为包含双字节字符的表达式设计的。CHRTRANC( ) 把单字节字符替换成双字节字符或双字节字符替换成单字节字符。如果表达式只包含单字节, CHRTRANC( ) 等同于 CHRTRAN( )。
该函数在操作象“平假名”和“片假名”这样的双字节字符集语言时是有用的。

示例:
a=[123456abcdefg]
b=[gfedcba654321]
c=[1a2b3c4d5e6fg]
?CHRTRANC(c,a,b)
?CHRTRANC(c,b,a)
jarkar 2013-05-16
  • 打赏
  • 举报
回复
CHRTRANC()是双字节转换,我现在是用CHRTRAN()单字节转换
加载更多回复(1)

2,727

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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