关于Base64编码的难题,请高手进来帮忙(VB6调用javascript函数示例)
本帖最后由 bcrun 于 2014-06-14 11:07:30 编辑
关于VB6的base64编码,百度搜索有不少代码,但都没能实现如下功能。似乎都是GB2312编码
将 《中华人民共和国》 编码成 《5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9》
后来发现在线编码工具 http://tool.chinaz.com/Tools/base64.aspx
在上面的文本框内输入:中华人民共和国
点击”Base64加密“按钮,就可以编码成 5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9
经查看html源文件,关键代码是:
function base64_encode() {
var str = CryptoJS.enc.Utf8.parse(jQuery("#content").val());
var base64 = CryptoJS.enc.Base64.stringify(str);
jQuery("#result").val(base64);
}
function base64_decode() {
var words = CryptoJS.enc.Base64.parse(jQuery("#result").val());
jQuery("#content").val(words.toString(CryptoJS.enc.Utf8));
}
请问,我如何通过VB6调用上述函数或组件,实现编码/解码功能?解决成功就结帖加分。
------解决思路----------------------
js处理字符串默认是使用unicode编码的,而且他的那些基础语法和对象什么的也不认识其它的如GBK这样的编码。你这任务,可能最佳的办法是把针对GBK编码的VB6的base64编码升级一下,加进UNICODE的支持。当然,直接封装引用一下其它语言的现成库也是一个好办法。
------解决思路----------------------
他这个结果,有什么好特殊的!
按他Base64的长度:28字符
就知道,先把7个汉字转换出UTF-8编码(21字节),
再把这个UTF-8编码转Base64(28字符)。
如果这7个汉字按ANSI码或Unicode码(都是14字节)来转Base64,结果都是20个字符。
------解决思路----------------------
本帖最后由 bcrun 于 2014-06-14 11:06:01 编辑
首先要着重指出:后面专门给出的测试代码,主要还是为了演示通用用途上的,通过VB6调用js函数来重用飞速扩大的各种JS库函数功能。并非是在楼主这个具体的需求中,认为调用js胜过使用原生VB6代码的BASE64编码函数,或调用别的dll中的BASE64编码功能
其实免费的库中,无论是以前说过的模仿mscorlib的vbcorlib库,还是本版置顶的vbRichClient5库中,都有相应的base64编码的类。如果实在要调用js库来实现的话,可先对你说的那个页面中相应部分代码做一下提取。相应的两个js要下载了,本地简化的测试页面如下(注意保存为utf-8编码):
网页testbase64.html如下
html>
测试base64function base64_encode(sContent) {
var str = CryptoJS.enc.Utf8.parse(sContent);
var base64 = CryptoJS.enc.Base64.stringify(str);
return(base64);
}
function base64_decode() {
var words = CryptoJS.enc.Base64.parse(jQuery("#result").val());
jQuery("#content").val(words.toString(CryptoJS.enc.Utf8));
}
document.write(base64_encode("中华人民共和国"))
调用js函数的vb代码:
Option Explicit
Private Sub btnEncode_Click()
'本代码只是描述调用原理,在实际软件生产的编程中,还要增加代码,控制好包括网页加载尚未完成等情况在内的错误预防或异常处理等
Dim s1 As String
s1 = "中华人民共和国"
'像下面这句这样多级调用对象成员,虽然很多时候是可以的,但受特殊情况影响失败的可能性也不少。
'比如在这里测试就失败了
'MsgBox WebBrowser1.Document.parentWindow.CryptoJS.enc.Base64.stringify(s1)
'相对来说,下面这样简单化调用最外层已经封装好的自己定制的js函数更可靠些
MsgBox WebBrowser1.Document.parentWindow.base64_encode(s1)
End Sub
Private Sub Form_Load()
Dim sFile As String
sFile = App.Path & "\testbase64.html"
WebBrowser1.Navigate2 sFile
End Sub
------解决思路----------------------
引用:bcrun 版主,我下载了API论坛置顶子中的 vbRichClient5 实例程序,引用了 vbRichClient5.dll,不好意思,我在对象浏览器中,没有看到哪个是编码/解码函数(类似于Base64Encode/Base64Decode),烦请指导。
思路不对,你在F2中查找base64,就会看到有个cCrypt类有Base64Enc和Base64Dec方法了
------解决思路----------------------
Base-64 本质是对字节流(VB中是 Byte 数组)进行编码。
而对字符串(VB 中的 String)编码需要先用某种编码进行 String -> Byte数组 的转换。这里选用编码(ANSI、Unicode、UTF-8等)不同就有不同的结果。
CryptoJS.enc.Utf8.parse 明显是 UTF-8 的,
先用这个帖子中的 UTF8_Encode(我7楼修正的方式,并且返回类型改为 Byte())转换,
再用普通的 Base-64 函数,
得到正确结果 5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9 。
------解决思路----------------------
[code=VB]arrB = StrConv(strSource, vbFromUnicode)[/b]
这是 ANSI 编码,改用 UTF8_Encode。
你连自己的代码都不明白!
------解决思路----------------------
关于编码问题,我在4F 都已经提到过的了。
但在“版主大人”的光环面前,
楼主似乎已经看不到俺这种小人物的存在了。
UTF-8编码转BASE64那个,不知道怎么最后的两个字符不一样。
BASE64算法的代码是我1个多月前写的。
当时进行过好多次测试,经验证是正确的呢。
本来今天想手工处理一下,看结果究竟应该是啥,
只是上班太忙了,没来得及。
这个只有明天处理了。
------解决思路----------------------
我也没留意到你4楼的回复,明显被各种回复淹没了。
只看到两个人在贴各种 Base64Encode(String) 函数,这有多么不靠谱,Base-64 的源数据怎么成了字符串了!!!
我自己编写的方法首先要有一个 Base64Encode(Byte()) 的函数,然后再封装出各种的 Base64EncodeA(String)、Base64EncodeU(String)……
------解决思路----------------------
那个时候,根本就没考虑那么多的事。
只是想着,把A格式编码的文本,转为B格式;B格式的能转回来。
主要目的是完成自己的代码算法。
因为当时在“百度百科”看到的VB6代码,
我的评价是:又长又臭!
因为并没有牵涉到具体的应用环境,
在“参数”上没去管那么多(并且也没打算“发表出来”)。
今天也发现出出错的原因,并不是BASE54算法错误。
是因为7个汉字的UTF8编码是21字节,
那儿调用Strconv()时,第21字节“单了1个”,它变成空字符了,
传入编码函数,第21字节由非0变成0。
因此最后2个码不一样了。
我试了一下再加个汉字在后面,
转出来的BASE64码就正确了(前28个跟楼主的一致)。
------解决思路----------------------
仅供参考,尽管不是VB6
#pragma comment(lib,"crypt32")
#include
#include
#include
//+-------------------------------------------------------------------------
// convert formatted string to binary
// If cchString is 0, then pszString is NULL terminated and
// cchString is obtained via strlen() + 1.
// dwFlags defines string format
// if pbBinary is NULL, *pcbBinary returns the size of required memory
// *pdwSkip returns the character count of skipped strings, optional
// *pdwFlags returns the actual format used in the conversion, optional
//--------------------------------------------------------------------------
BOOL
WINAPI
CryptStringToBinaryA(
IN LPCSTR pszString,
IN DWORD cchString,
IN DWORD dwFlags,
IN BYTE *pbBinary,
IN OUT DWORD *pcbBinary,
OUT DWORD *pdwSkip, //OPTIONAL
OUT DWORD *pdwFlags //OPTIONAL
);
//+-------------------------------------------------------------------------
// convert formatted string to binary
// If cchString is 0, then pszString is NULL terminated and
// cchString is obtained via strlen() + 1.
// dwFlags defines string format
// if pbBinary is NULL, *pcbBinary returns the size of required memory
// *pdwSkip returns the character count of skipped strings, optional
// *pdwFlags returns the actual format used in the conversion, optional
//--------------------------------------------------------------------------
BOOL
WINAPI
CryptStringToBinaryW(
IN LPCWSTR pszString,
IN DWORD cchString,
IN DWORD dwFlags,
IN BYTE *pbBinary,
IN OUT DWORD *pcbBinary,
OUT DWORD *pdwSkip, //OPTIONAL
OUT DWORD *pdwFlags //OPTIONAL
);
#ifdef UNICODE
#define CryptStringToBinary CryptStringToBinaryW
#else
#define CryptStringToBinary CryptStringToBinaryA
#endif // !UNICODE
//+-------------------------------------------------------------------------
// convert binary to formatted string
// dwFlags defines string format
// if pszString is NULL, *pcchString returns the size of required memory in byte
//--------------------------------------------------------------------------
BOOL
WINAPI
CryptBinaryToStringA(
IN CONST BYTE *pbBinary,
IN DWORD cbBinary,
IN DWORD dwFlags,
IN LPSTR pszString,
IN OUT DWORD *pcchString
);
//+-------------------------------------------------------------------------
// convert binary to formatted string
// dwFlags defines string format
// if pszString is NULL, *pcchString returns the size of required memory in byte
//--------------------------------------------------------------------------
BOOL
WINAPI
CryptBinaryToStringW(
IN CONST BYTE *pbBinary,
IN DWORD cbBinary,
IN DWORD dwFlags,
IN LPWSTR pszString,
IN OUT DWORD *pcchString
);
#ifdef UNICODE
#define CryptBinaryToString CryptBinaryToStringW
#else
#define CryptBinaryToString CryptBinaryToStringA
#endif // !UNICODE
// dwFlags has the following defines
#define CRYPT_STRING_BASE64HEADER 0x00000000
#define CRYPT_STRING_BASE64 0x00000001
#define CRYPT_STRING_BINARY 0x00000002
#define CRYPT_STRING_BASE64REQUESTHEADER 0x00000003
#define CRYPT_STRING_HEX 0x00000004
#define CRYPT_STRING_HEXASCII 0x00000005
#define CRYPT_STRING_BASE64_ANY 0x00000006
#define CRYPT_STRING_ANY 0x00000007
#define CRYPT_STRING_HEX_ANY 0x00000008
#define CRYPT_STRING_BASE64X509CRLHEADER 0x00000009
#define CRYPT_STRING_HEXADDR 0x0000000a
#define CRYPT_STRING_HEXASCIIADDR 0x0000000b
#define CRYPT_STRING_NOCR 0x80000000
// CryptBinaryToString uses the following flags
// CRYPT_STRING_BASE64HEADER - base64 format with certificate begin
// and end headers
// CRYPT_STRING_BASE64 - only base64 without headers
// CRYPT_STRING_BINARY - pure binary copy
// CRYPT_STRING_BASE64REQUESTHEADER - base64 format with request begin
// and end headers
// CRYPT_STRING_BASE64X509CRLHEADER - base64 format with x509 crl begin
// and end headers
// CRYPT_STRING_HEX - only hex format
// CRYPT_STRING_HEXASCII - hex format with ascii char display
// CRYPT_STRING_HEXADDR - hex format with address display
// CRYPT_STRING_HEXASCIIADDR - hex format with ascii char and address display
//
// CryptBinaryToString accepts CRYPT_STRING_NOCR or'd into one of the above.
// When set, line breaks contain only LF, instead of CR-LF pairs.
// CryptStringToBinary uses the following flags
// CRYPT_STRING_BASE64_ANY tries the following, in order:
// CRYPT_STRING_BASE64HEADER
// CRYPT_STRING_BASE64
// CRYPT_STRING_ANY tries the following, in order:
// CRYPT_STRING_BASE64_ANY
// CRYPT_STRING_BINARY -- should always succeed
// CRYPT_STRING_HEX_ANY tries the following, in order:
// CRYPT_STRING_HEXADDR
// CRYPT_STRING_HEXASCIIADDR
// CRYPT_STRING_HEXASCII
// CRYPT_STRING_HEX
char *flags[12]={
"CRYPT_STRING_BASE64HEADER",
"CRYPT_STRING_BASE64",
"CRYPT_STRING_BINARY",
"CRYPT_STRING_BASE64REQUESTHEADER",
"CRYPT_STRING_HEX",
"CRYPT_STRING_HEXASCII",
"CRYPT_STRING_BASE64_ANY",
"CRYPT_STRING_ANY",
"CRYPT_STRING_HEX_ANY",
"CRYPT_STRING_BASE64X509CRLHEADER",
"CRYPT_STRING_HEXADDR",
"CRYPT_STRING_HEXASCIIADDR",
};
#define MAXC 1024
BYTE b[22]={
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x41,0x42,0xB0,0xA1,0x4A,0x55,
};
BOOL r;
DWORD len,dwFlags;
TCHAR s[MAXC];
int _tmain() {
_tprintf(_T("API CryptBinaryToString in crypt32.dll Demonstration:\n"));
for (dwFlags=0;dwFlags<12;dwFlags++) {
if (dwFlags==2
------解决思路----------------------
dwFlags==6
------解决思路----------------------
dwFlags==7
------解决思路----------------------
dwFlags==8) continue;
r=CryptBinaryToString(b,22,dwFlags,NULL,&len);
if (!r) {
_tprintf(_T("CryptBinaryToString error!\n"));
return 1;
}
if (len>MAXC) {
_tprintf(_T("%d==len>MAXC==%d!\n"),len,MAXC);
return 2;
}
r=CryptBinaryToString(b,22,dwFlags,s,&len);
if (!r) {
_tprintf(_T("CryptBinaryToString error!\n"));
return 3;
}
_tprintf(_T("\n%s:[\n%s]\n"),flags[dwFlags],s);
}
return 0;
}
//API CryptBinaryToString in crypt32.dll Demonstration:
//
//CRYPT_STRING_BASE64HEADER:[
//-----BEGIN CERTIFICATE-----
//AAECAwQFBgcICQoLDA0OD0FCsKFKVQ==
//-----END CERTIFICATE-----
//]
//
//CRYPT_STRING_BASE64:[
//AAECAwQFBgcICQoLDA0OD0FCsKFKVQ==
//]
//
//CRYPT_STRING_BASE64REQUESTHEADER:[
//-----BEGIN NEW CERTIFICATE REQUEST-----
//AAECAwQFBgcICQoLDA0OD0FCsKFKVQ==
//-----END NEW CERTIFICATE REQUEST-----
//]
//
//CRYPT_STRING_HEX:[
// 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
// 41 42 b0 a1 4a 55
//]
//
//CRYPT_STRING_HEXASCII:[
// 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................
// 41 42 b0 a1 4a 55 AB..JU
//]
//
//CRYPT_STRING_BASE64X509CRLHEADER:[
//-----BEGIN X509 CRL-----
//AAECAwQFBgcICQoLDA0OD0FCsKFKVQ==
//-----END X509 CRL-----
//]
//
//CRYPT_STRING_HEXADDR:[
//0000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
//0010 41 42 b0 a1 4a 55
//]
//
//CRYPT_STRING_HEXASCIIADDR:[
//0000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................
//0010 41 42 b0 a1 4a 55 AB..JU
//]
//