本来想把PB 的函数封装成COM组件调用,结果怎么都搞不定,只能讲代码搞出来换种语言实现了.
string s_ret integer i_first,i_second,i_third,i_fourth integer by4,i,reallen long i_total string is_key string is_base64 string EncMap[0 to 63] int DecMap[0 to 127] integer by3 long i_len is_base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" is_base64 = is_base64 + "abcdefghijklmnopqrstuvwxyz" is_base64 = is_base64 + "0123456789" is_base64 = is_base64 + "+/" for i = 1 to 63 EncMap[i]=mid(is_base64,i+1,1) next for i = 1 to 63 DecMap[asc(EncMap[i])] = i next choose case a_type case 0//加密 s_ret = "" if len(a_text)= 0 then return s_ret end if by3=len(a_text) - mod(len(a_text),3) i=1 do while i<= by3 i_first = asc(mid(a_text,i + 0,1)) i_second = asc(mid(a_text, i + 1,1)) i_third = asc(mid(a_text,i + 2,1)) s_ret = s_ret + encmap[i_first / 4] s_ret = s_ret + encmap[mod(i_first , 4) * 16 + i_second / 16 ] s_ret = s_ret + encmap[mod(i_second , 16) * 4 + i_third / 64 ] s_ret = s_ret + encmap[mod(i_third , 64)] i = i + 3 loop if i <= len(a_text) then i_first = asc(mid(a_text, i + 0, 1)) if mod(len(a_text), 3)=2 then i_second =asc(mid(a_text,i+1,1)) s_ret = s_ret + encmap[i_first / 4] s_ret = s_ret + encmap[mod(i_first , 4) * 16 + i_second / 16 ] s_ret = s_ret + encmap[mod(i_second , 16) * 4 ] s_ret = s_ret + "=" else s_ret = s_ret + encmap[i_first / 4] s_ret = s_ret + encmap[mod(i_first,4) * 16] s_ret = s_ret + "==" end if end if i_len = len(s_ret) s_ret = left(string(i_len+10),2) + s_ret case 1//解密 if len(a_text)= 0 then s_ret = "" return s_ret end if a_text=right(a_text,len(a_text)-2) reallen = len(a_text) do while mid(a_text,reallen,1) = "=" reallen = reallen - 1 loop by4=reallen - mod(reallen,4) i=1 do while i<= by4 i_first = decmap[asc(mid(a_text,i + 0,1))] i_second = decmap[asc(mid(a_text, i + 1,1))] i_third = decmap[asc(mid(a_text,i + 2,1))] i_fourth = decmap[asc(mid(a_text,i + 3,1))] s_ret = s_ret + char(i_first * 4 + i_second / 16) s_ret = s_ret + char(mod(i_second,16) * 16 + i_third / 4 ) if mod(i_third,4) * 64 + i_fourth <> 0 then s_ret = s_ret + char(mod(i_third,4) * 64 + i_fourth) end if i = i + 4 loop if i<= reallen then //只可能是xx==或xxx=两种形式有效 if mod(reallen,4) = 2 then //xx==形式 i_first = decmap[asc(mid(a_text,i + 0,1))] i_second = decmap[asc(mid(a_text, i + 1,1))] s_ret = s_ret + char(i_first * 4 + i_second / 16) s_ret = s_ret + char(mod(i_second,16) * 16) else i_first = decmap[asc(mid(a_text,i + 0,1))] i_second = decmap[asc(mid(a_text, i + 1,1))] i_third = decmap[asc(mid(a_text,i + 2,1))] s_ret = s_ret + char(i_first * 4 + i_second / 16) s_ret = s_ret + char(mod(i_second,16) * 16 + i_third / 4 ) end if end if end choose return s_ret
public static string right(string s1, int str) { return s1.Substring(s1.Trim().Length - str, str); } public static string left(string s1, int str) { return s1.Substring( 0, str); } public static char mid(string s1, int str, int len) { return s1.Substring(str, len).ToArray()[0]; } public static int asc(char c1) { return(int)c1; } public static int mod(int x,int y) { return x % y; } public static int len(string s1) { return s1.Length; } public static string encrypt(string a_text, string type = "1") { string s_ret; int i_first, i_second, i_third, i_fourth; int by4, i, reallen; long i_total; string is_key; string is_base64; char[] encmap = new char[64]; int[] decmap = new int[128]; int by3 = 0; long i_len; is_base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; is_base64 = is_base64 + "abcdefghijklmnopqrstuvwxyz"; is_base64 = is_base64 + "0123456789"; is_base64 = is_base64 + "+/"; char[] tk = is_base64.ToCharArray(); for (i = 1; i <= 63; i++) { encmap[i] = tk[i]; } for (i = 1; i <= 63; i++) { int tp = (int)asc(encmap[i]); decmap[tp] = i; } s_ret = ""; if (a_text.Trim() == "") { return s_ret; } if (type == "1") { by3 = a_text.Length - (a_text.Length % 3); i = 0; while (i < by3) { i_first = asc(mid(a_text, i + 0, 1)); i_second = asc(mid(a_text, i + 1, 1)); i_third = asc(mid(a_text, i + 2, 1)); s_ret = s_ret + encmap[i_first / 4]; s_ret = s_ret + encmap[mod(i_first, 4) * 16 + i_second / 16]; s_ret = s_ret + encmap[mod(i_second, 16) * 4 + i_third / 64]; s_ret = s_ret + encmap[mod(i_third, 64)]; i = i + 3; } if (i < len(a_text)) { i_first = asc(mid(a_text, i + 0, 1)); if ((a_text.Length % 3) == 2) { i_second = asc(mid(a_text, i + 1, 1)); s_ret = s_ret + encmap[i_first / 4]; s_ret = s_ret + encmap[mod(i_first, 4) * 16 + i_second / 16]; s_ret = s_ret + encmap[mod(i_second, 16) * 4]; s_ret = s_ret + "="; } else { s_ret = s_ret + encmap[i_first / 4]; s_ret = s_ret + encmap[mod(i_first, 4) * 16]; s_ret = s_ret + "=="; } } i_len = len(s_ret); s_ret = left((i_len + 10).ToString(), 2) + s_ret; } else { a_text = right(a_text, len(a_text) - 2); reallen = len(a_text); while (mid(a_text, reallen - 1, 1) == ‘=‘) { reallen = reallen - 1; } by4 = reallen - mod(reallen, 4); i = 0; while (i < by4) { i_first = decmap[asc(mid(a_text, i + 0, 1))]; i_second = decmap[asc(mid(a_text, i + 1, 1))]; i_third = decmap[asc(mid(a_text, i + 2, 1))]; i_fourth = decmap[asc(mid(a_text, i + 3, 1))]; s_ret = s_ret + (char)(i_first * 4 + i_second / 16); s_ret = s_ret + (char)(mod(i_second, 16) * 16 + i_third / 4); if (mod(i_third, 4) * 64 + i_fourth != 0) { s_ret = s_ret + (char)(mod(i_third, 4) * 64 + i_fourth); } i = i + 4; } if (i < reallen) { //只可能是xx==或xxx=两种形式有效 if (mod(reallen, 4) == 2) //xx==形式 { i_first = decmap[asc(mid(a_text, i + 0, 1))]; i_second = decmap[asc(mid(a_text, i + 1, 1))]; s_ret = s_ret + (char)(i_first * 4 + i_second / 16); s_ret = s_ret + (char)(mod(i_second, 16) * 16); } else { i_first = decmap[asc(mid(a_text, i + 0, 1))]; i_second = decmap[asc(mid(a_text, i + 1, 1))]; i_third = decmap[asc(mid(a_text, i + 2, 1))]; s_ret = s_ret + (char)(i_first * 4 + i_second / 16); s_ret = s_ret + (char)(mod(i_second, 16) * 16 + i_third / 4); } } } return s_ret; }