vb获取html中的inout,关于Base64编码的难题,请来帮忙(VB6调用javascript函数示例)

关于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>

测试base64

function 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 都已经提到过的了。

但在“版主大人”的光环面前,

楼主似乎已经看不到俺这种小人物的存在了。

131231338.gif

131231339.jpg

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

//]

//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值