用VFP编的BASE64加密和解密函数(转载)

   我们知道,VFP9.0里有关于BASE64的函数:
    STRCONV(cExpression, 13)加密
    STRCONV(cExpression, 14)解密

vfp6.0没有次函数

转载一个

DEFINE BASESTR "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
#DEFINE BASEPAD "="
FUNCTION GetBitStr &&将十进制数转换为6位或8位的二进制格式
	PARAMETERS nNum,nBit
	LOCAL retStr as String ,nMod as Integer ,nGet as Integer 
	retStr=""
	nGet=nNum
	nMod=MOD(nGet,2)
	DO WHILE NOT nGet=0 
		nMod=MOD(nGet,2)
		nGet=INT(nGet/2)
		retStr=ALLTRIM(STR(nMod))+retStr
	ENDDO
	RETURN PADL(retStr,nBit,"0")
ENDFUNC 

FUNCTION GetDecNum &&将二进制格式的数字串转换为十进制数
	PARAMETERS cBit
	LOCAL retNum as Integer,nSit as Integer,nTime as Integer  ,nLen as Integer , n as Integer 
	retNum=0
	nLen=LEN(cBit)
	FOR n=1 TO nLen-1
		nSit=IIF(SUBSTR(cBit,n,1)="1",2,0)
		nTime=nLen-n
		retNum=retNum+nSit^nTime
	ENDFOR 
	retNum=retNum+IIF(RIGHT(cBit,1)="1",1,0)
	RETURN retNum 
ENDFUNC 

FUNCTION GetBase64 &&加密
	PARAMETERS strGet
	LOCAL retStr as String ,n as Integer ,nLen as Integer ,tmpBitStr as String ,nAdd as Integer 
	retStr=""
	tmpBitStr=""
	nLen=LEN(strGet)
	FOR n=1 TO nLen
		tmpBitStr=tmpBitStr+GetBitStr(ASC(SUBSTR(strGet,n,1)),8)
	ENDFOR 
	nAdd=IIF(LEN(tmpBitStr)%6=0,0,6-LEN(tmpBitStr)%6)
	tmpBitStr=tmpBitStr+REPLICATE("0",nAdd)
	FOR n=1 TO LEN(tmpBitStr) STEP 6 
		retStr=retStr+SUBSTR(BASESTR,GetDecNum(SUBSTR(tmpBitStr,n,6))+1,1)
	ENDFOR 
	RETURN retStr+REPLICATE(BASEPAD,nAdd/2)
ENDFUNC 

FUNCTION FromBase64 &&解密
	PARAMETERS strFromR
	LOCAL retStr as String , strFrom as String ,n as Integer ,nLen as Integer ,tmpBitStr as String ,nAdd as Integer 
	nAdd=OCCURS(BASEPAD,strFromR)
	strFrom=STRTRAN(strFromR,BASEPAD,"")
	retStr=""
	tmpBitStr=""
	nLen=LEN(strFrom)
	FOR n=1 TO nLen
		tmpBitStr=tmpBitStr+GetBitStr(AT(SUBSTR(strFrom,n,1),BASESTR)-1,6)
	ENDFOR 
	tmpBitStr=LEFT(tmpBitStr,nLen*6-2*nAdd) 
	FOR n=1 TO LEN(tmpBitStr) STEP 8
		retStr=retStr+CHR(10)+ALLTRIM(STR(GetDecNum(SUBSTR(tmpBitStr,n,8))))
	ENDFOR 
	*GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,
	*习惯上称第一个字节为“高字节”,第二个字节为“低字节”。
	*GB2312中汉字的编码范围为:
	*第一个字节0xB0-0xF7(对应十进制为176-247),
	*第二个字节0xA0-0xFE(对应十进制为160-254)。
	*高字节码X256+低字节码,就是汉字的ASC码,如:
	*好的高字节186,低字节195,好的ASC码就是186*256+195=47811
	ALINES(aStr,RetStr)
	retStr=""
	n=1
	DO WHILE  n<=ALEN(aStr)
		IF VAL(aStr(n))>=176 AND VAL(aStr(n))<=247 
			retStr=retStr+CHR(VAL(aStr(n))*256+VAL(aStr(n+1)))
			n=n+2
		ELSE 
			retStr=retStr+CHR(VAL(aStr(n))) 
			n=n+1
		ENDIF  
	ENDDO  
	RETURN retStr
ENDFUNC 
 » 本站地址:http://www.gomoth.com
  • 您可能感兴趣的相关文章