hur.cn - 华软网

 热门搜索

高分求Base64算法源码!

  作者:未知    来源:网络    更新时间:2018/10/12
如题,

谁有Base64算法的pb代码


------华软网友回答------
http://www.lihuasoft.net/source/show.php?id=3646

里面有代码,你把它改成PB的吧
------华软网友回复------
//给你一个我以前写的
$PBExportHeader$nvo_base64.sru
forward
global type nvo_base64 from nonvisualobject
end type
end forward

global type nvo_base64 from nonvisualobject
end type
global nvo_base64 nvo_base64

forward prototypes
public function string of_oct (long vl_dec)
public function integer of_myasc (character onechar)
public function string of_b64e (string vs_in)
public function string of_nchar (character vchar, long vl_count)
public function integer of_oct2dec (string vs_oct)
end prototypes

public function string of_oct (long vl_dec);//==============================================================================
// 函数: of_oct()
//------------------------------------------------------------------------------
//描写: 10进制=>8进制
//例:十进制转换成八进制:(66)10=(102)8
// 66/8=8 余 2
// 8/8=1 余 0
// 1/8=0 余 1
// 结果为余数的逆序:102 。
//------------------------------------------------------------------------------
// 参数: vl_dec 传入的十进制数      
//------------------------------------------------------------------------------
// 前往值:  string  output 八进制字符串
//------------------------------------------------------------------------------
// 作者:   Ken Li      日期: 2005.03.11
//------------------------------------------------------------------------------
// 修改历史: 
//   
//==============================================================================
long i,li_shang
char li_yu[]
li_shang = vl_dec/8
li_yu[1] = string(mod(vl_dec,8))
i = 2

do while li_shang > 0 
   li_yu[i] = string(mod(li_shang,8))
   i ++
   li_shang = li_shang/8
loop

return Reverse(li_yu)
end function

public function integer of_myasc (character onechar);//==============================================================================
// 函数: of_myasc()
//------------------------------------------------------------------------------
// 描写: 用于of_b64e()
//------------------------------------------------------------------------------
// 参数: OneChar 传入的一个字符      
//------------------------------------------------------------------------------
// 前往值:  integer
//------------------------------------------------------------------------------
// 作者:   Ken Li      日期: 2005.03.11
//------------------------------------------------------------------------------
// 修改历史: 
//   
//==============================================================================
IF OneChar = "" THEN
   RETURN 0
ELSE
   RETURN Asc(OneChar)
END IF


end function

public function string of_b64e (string vs_in);//==============================================================================
// 函数: of_b64e()
//------------------------------------------------------------------------------
// 描写: 把字符串用base64算法加密
//------------------------------------------------------------------------------
// 参数: Value vs_in: input string
//------------------------------------------------------------------------------
// 前往值:  string 加密后的字符串
//------------------------------------------------------------------------------
// 作者:   Ken Li      日期: 2005.03.11
//------------------------------------------------------------------------------
// 修改历史: 
//   
//==============================================================================


Constant string Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
string ls_out
int i

For i = 1 To Len(vs_in) Step 3
    Long ll_Group
    string ls_Group,ls_pOut
    
    ll_Group = 65536 * Asc(Mid(vs_in, i, 1)) + 256 * of_MyAsc(Mid(vs_in, i + 1, 1)) + of_MyAsc(Mid(vs_in, i + 2, 1))
    ls_Group = of_Oct(ll_Group)
    ls_Group = of_nChar('0',8 - Len(ls_Group)) + ls_Group
    ls_pOut = Mid(Base64, of_oct2dec(Mid(ls_Group, 1, 2)) + 1, 1) + Mid(Base64, of_oct2dec(Mid(ls_Group, 3, 2)) + 1, 1) + Mid(Base64, of_oct2dec(Mid(ls_Group, 5, 2)) + 1, 1) + Mid(Base64, of_oct2dec(Mid(ls_Group, 7, 2)) + 1, 1)
    ls_Out = ls_Out + ls_pOut
    If mod( (i + 2),57) = 0 Then ls_Out = ls_Out + "~r~n"
Next 

choose Case mod( Len(vs_in), 3)
    Case 1
       ls_Out = Left(ls_Out, Len(ls_Out) - 2) + "=="
    Case 2
       ls_Out = Left(ls_Out, Len(ls_Out) - 1) + "="
End choose
return ls_Out


end function

public function string of_nchar (character vchar, long vl_count);//====================================================================
// 函数: of_nchar
//--------------------------------------------------------------------
// 描写:前往由N个相同的CHAR组成的字符串
//--------------------------------------------------------------------
// 参数:
//    value   char   vchar      a char for input      
//    value   long   vl_count   表示要生成字符串的长度         
//--------------------------------------------------------------------
// 前往值:  string
//--------------------------------------------------------------------
// 作者:   Ken Li      日期: 2005.03.11
//--------------------------------------------------------------------
// 修改历史: 
//   
//====================================================================

Char ls_out[]
Long i
FOR i = 1 TO vl_count
   ls_out[i] = vchar
NEXT
RETURN  ls_out


end function

public function integer of_oct2dec (string vs_oct);//====================================================================
// 函数: of_oct2dec
//--------------------------------------------------------------------
// 描写: 八进制转十进制 
//--------------------------------------------------------------------
// 参数:
//    value   string   vs_oct 八进制字符串
//--------------------------------------------------------------------
// 前往值:  long 十进制数字
//--------------------------------------------------------------------
// 作者:   Ken Li      日期: 2005.03.11
//--------------------------------------------------------------------
// 修改历史: 以后思量加上检验vs_oct是否为有效的8进制串
//====================================================================
string ls_oct
integer i,length
long result = 0

length = len(vs_oct)
ls_oct = Upper(vs_oct)
FOR i = 1 to length
   result += &
     (Pos ('1234567', mid(ls_oct, i, 1)) * &
     ( 8 ^  ( length - i )  ))
NEXT

RETURN result

end function

on nvo_base64.create
call super::create
TriggerEvent( this, "constructor" )
end on

on nvo_base64.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on


------华软网友回复------
再给你一个VB写的, 有兴趣的话能够改写PB代码

Public Function Base64En(ByVal StrIn As String) As String
    Dim mAllByteIn() As Byte, mAllByteOut() As Byte
    Dim mInByte(2) As Byte, mOutByte(3) As Byte
    Dim myByte As Byte
    Dim i As Integer, LineLen As Integer, j As Integer, m As Integer, n As Integer
    n = 3: m = 0
    mAllByteIn() = StrConv(StrIn, vbFromUnicode)
    For i = 0 To UBound(mAllByteIn()) Step 3
        j = 0
        Do While j < 3
            mInByte(j) = mAllByteIn(i + j)
            j = j + 1
            If i + j > UBound(mAllByteIn()) Then Exit Do
        Loop
        Base64EncodeByte mInByte, mOutByte, j
        ReDim Preserve mAllByteOut(n)
        For j = 0 To 3
            mAllByteOut(n - 3 + j) = mOutByte(j)
        Next j
        n = n + 4
        m = m + 4
        If m > 70 Then
            m = 0
            n = n + 2
            ReDim Preserve mAllByteOut(n)
            mAllByteOut(n - 2) = &HD
            mAllByteOut(n - 1) = &HA
        End If
    Next i
    Base64En = StrConv(mAllByteOut(), vbUnicode)
End Function


------华软网友回复------
上面少贴了一个VB的函数

Private Sub Base64EncodeByte(mInByte() As Byte, mOutByte() As Byte, Num As Integer)
Dim tByte As Byte
Dim i As Integer

If Num = 1 Then
    mInByte(1) = 0
    mInByte(2) = 0
ElseIf Num = 2 Then
    mInByte(2) = 0
End If

tByte = mInByte(0) And &HFC
mOutByte(0) = tByte / 4
tByte = ((mInByte(0) And &H3) * 16) + (mInByte(1) And &HF0) / 16
mOutByte(1) = tByte
tByte = ((mInByte(1) And &HF) * 4) + ((mInByte(2) And &HC0) / 64)
mOutByte(2) = tByte
tByte = (mInByte(2) And &H3F)
mOutByte(3) = tByte

For i = 0 To 3
    If mOutByte(i) >= 0 And mOutByte(i) <= 25 Then
        mOutByte(i) = mOutByte(i) + Asc("A")
    ElseIf mOutByte(i) >= 26 And mOutByte(i) <= 51 Then
        mOutByte(i) = mOutByte(i) - 26 + Asc("a")
    ElseIf mOutByte(i) >= 52 And mOutByte(i) <= 61 Then
        mOutByte(i) = mOutByte(i) - 52 + Asc("0")
    ElseIf mOutByte(i) = 62 Then
        mOutByte(i) = Asc("+")
    Else
        mOutByte(i) = Asc("/")
    End If
Next i

If Num = 1 Then
    mOutByte(2) = Asc("=")
    mOutByte(3) = Asc("=")
ElseIf Num = 2 Then
    mOutByte(3) = Asc("=")
End If

End Sub

------华软网友回复------
mark
------华软网友回复------
ding
------华软网友回复------
顶      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。