请教大侠,VB6将图片转换为base64编码,我实在没招了,好多算法不准确

奋斗一生的程序员 2018-04-18 10:11:26
网上有不少base64编码,越测越蒙,快失去活着的信念了。
我们要将jpg图片转换为base64编码,转换后的base64编码,要求和这个网址转换结果是一样的。
https://tool.css-js.com/base64.html
传入参数是本地电脑打开的一个图片文件,输出结果是base64编码。请大侠给出经过成功测试的VB6代码或工程,谢谢了。
...全文
2038 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
结帖。结帖。结帖。
赵4老师 2018-04-23
  • 打赏
  • 举报
回复
去tmd与时俱进! 我就要走在老路上 我就要回到老地方 哦噢,花房姑娘……
笨狗先飞 2018-04-20
  • 打赏
  • 举报
回复
引用 33 楼 chewinggum 的回复:
[quote=引用 32 楼 bakw 的回复:] 知道你们能用我不能用就行了,懒得研究这个,反正HMAC-SHA1我用php算的。 这个错误明显是一个dll错误,天知道怎么回事,所以我说他不好用。
我这win10跑的,正常。 系统要与时俱进……[/quote] 确实在win10下跑没看见这毛病。。。 与时俱进就不该用VB啦
脆皮大雪糕 2018-04-20
  • 打赏
  • 举报
回复
引用 32 楼 bakw 的回复:
知道你们能用我不能用就行了,懒得研究这个,反正HMAC-SHA1我用php算的。 这个错误明显是一个dll错误,天知道怎么回事,所以我说他不好用。
我这win10跑的,正常。 系统要与时俱进……
笨狗先飞 2018-04-20
  • 打赏
  • 举报
回复
知道你们能用我不能用就行了,懒得研究这个,反正HMAC-SHA1我用php算的。 这个错误明显是一个dll错误,天知道怎么回事,所以我说他不好用。
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
怎么“不一样”了!!! 



我试了一张比较小的图片。
这些txt文件中:
18a.txt是我的程序转换的、每76字符换行的BASE64结果;
18b.txt是我把“回车换行”删除后的文件; 18c.txt是用你的代码转换的结果; 18d.txt是那个网站的转换结果。
自己看看“文件比较”的结果:都是“找不到差异”的,说明就是一样!

能不能“一致”是算法问题!
只要这个“小图片”(我主要是“内容少些”好处理)能够相同,那么不管源数据有多少都能“相同”。


不知道你说的“不相同”,是不是因为网站转换结果,默认是“有包头”的,
 你要去掉它的“包头”,只比较“数据”啊 !!!
  • 打赏
  • 举报
回复
引用 6 楼 jlmugua 的回复:
[quote=引用 3 楼 Chen8013 的回复:] 抱歉, 此处没看懂
我将我的代码传上来了,转换后的编码,和一楼网址中的在线转换,结果不一样,请您看看。 http://www.notery.cn/pictobase64.rar[/quote] 加我qq:2776478814,可以试试
  • 打赏
  • 举报
回复
引用 3 楼 Chen8013 的回复:
抱歉, 此处没看懂
我将我的代码传上来了,转换后的编码,和一楼网址中的在线转换,结果不一样,请您看看。 http://www.notery.cn/pictobase64.rar
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
我搬来这段代码的目的就是提醒诸位,Windows是有现成的API用来做base64编码的。
赵4老师 2018-04-19
  • 打赏
  • 举报
回复
我搬来这段代码的目的就是提醒诸位,Windows是有现成的API用来做base64编码的。
赵4老师 2018-04-19
  • 打赏
  • 举报
回复
这个你只能去问微软了。 我不生产代码,我只是代码的搬运工。
笨狗先飞 2018-04-19
  • 打赏
  • 举报
回复
引用 12 楼 Chen8013 的回复:
@赵4老师 @zhao4zhong1 趁还可以回复1次,做个试验。 请无视这层楼的回复。 
@ 干嘛,引用就行了
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
@赵4老师 @zhao4zhong1 趁还可以回复1次,做个试验。 请无视这层楼的回复。 
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
KAO ! 现在这个破论坛不支持@了???
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
只要一提到BASE64、SHA、MD5之类的, 赵4 定会贴出9楼这种C++代码。 @zhao4zhong1 你可不可以解释一下,你上面那段代码,为什么这几个参数: CRYPT_STRING_BASE64HEADER CRYPT_STRING_BASE64 CRYPT_STRING_BASE64REQUESTHEADER CRYPT_STRING_BASE64X509CRLHEADER 操作结果相同??? 按照“宏定义”的注释,它们的结果应该是有区别的! 既然“有区别”,为什么结果又完全一样呢? 要是“事实上”没区别,那干吗搞出4个不同的宏出来、还“让人感觉有4种结果形式”!!!   就用一个“CRYPT_STRING_BASE64”不就行了!
赵4老师 2018-04-19
  • 打赏
  • 举报
回复
仅供参考:
#pragma comment(lib,"crypt32")
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

//+-------------------------------------------------------------------------
// 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
//]
//
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
引用 29 楼 bakw 的回复:
难道我电脑有问题,我补了引号364行报错,可能不支持xp啊。
364行? 只有HS1.cls的代码,才能有“364行”。 但我看了一下,“第364行”代码,全是“VB6自身的东西”,根本不存在“不支持WinXP”的事情啊! 那一句就算是在Win98中,也能正常执行的啊。
' 在 HS1.cls 中“第364行”是这样的:
Err.Raise vbObjectError Or &HD302&, _
          "HS1.Decode", _
          "Failed to determine decoded length, system error " _
        & CStr(Err.LastDllError)
PS: 你怎么跟那些“小白”发帖子提问一样了……   “有问题”了,具体是什么问题、在哪行代码出错,都不说清楚。    并不是说“说个行号”就算了事;你说“行”号,得同时说清楚是哪个模块中的啊!   你直接说清楚出错的那一行是什么样的代码,岂不是更好???   (就算说了模块、行号,别人还得下载跟你相同的代码,才有可能找到、并“分析问题”啊) 再PS: 这个帖子是楼主讨论“图片转BASE64编码”的,现在却讨论起你的问题来了………… 
笨狗先飞 2018-04-19
  • 打赏
  • 举报
回复
难道我电脑有问题,我补了引号364行报错,可能不支持xp啊。
舉杯邀明月 2018-04-19
  • 打赏
  • 举报
回复
引用 27 楼 bakw 的回复:
HS1 Demo 1-1.zip 不是引号这么简单~~~
就是zip文件是 7858字节那个吧! 他的“问题”就是Form1代码第70行那儿,少了个双引号,引起“语法错误”而已嘛…… (之前我下载的是另一个,不知道为何也是那样的。 ) 我加了个双引号后,“全编译运行”都没问题的了。 把“1到7”全部试了下,都是“正常运行”的,至于结果是否正确我就不知道了(因为还没明白它究竟搞什么鬼的)。
笨狗先飞 2018-04-19
  • 打赏
  • 举报
回复
HS1 Demo 1-1.zip 不是引号这么简单~~~
加载更多回复(14)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧