作者:iamlasong

一、编码规则

编码规则网上很多,为了文章的完整性,这里简单的叙述一下。Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。这样就把一个3字节为一组的数据重新编码成了4个字节。当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。这时在最后一组填充1到2个0字节。并在最后编码完成后在结尾添加1到2个 “=”。

例:将对ABC进行BASE64编码:

1、首先取ABC对应的ASCII码值。A(65)B(66)C(67);
2、再取二进制值A(01000001)B(01000010)C(01000011);
3、然后把这三个字节的二进制码接起来(010000010100001001000011);
4、 再以6位为单位分成4个数据块,并在最高位填充两个0后形成4个字节的编码后的值,(00010000)(00010100)(00001001)(00000011),其中蓝色部分为真实数据;
5、再把这四个字节数据转化成10进制数得(16)(20)(9)(3);
6、最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D),这里的值实际就是数据在字符表中的索引。

即: ABC编码为QUJD

同理,我们可以实现编码案例:  AB编码为QUI=   A编码为QQ==

注:BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

二、解码规则

解码过程就是把4个字节再还原成3个字节,再根据不同的数据形式把字节数组重新整理成数据。

三、编码目的

为什么发明这么个编码呢,其实这个编码的原理是很简单的,“破解”也很容易,电子邮件刚出来的时候,只传递英文字符,这没有问题,但是后来,中国人,日本人都要发email,这样问题就来了,因为这些字符有可能会被邮件服务器或者网关当成命令处理,故必须得有一种编码来对邮件进行加密,但是加密的目的是为了能够使得一些原始的服务器不出问题,加密简单,这样客户端程序加密解密也快,又要是明文Ascii编码,这样Base64就诞生了。当初设计人员主要是考虑了两个问题:
1、加密算法复杂程度和效率 
2、如何处理传输
    Base64基本都能满足,如果因为发一封邮件把CPU占到100%或者把内存给用完了,那就完全没必要了,编码之后只要普通人一眼看不出内容就行了。

四、VB实现的编码和解码函数(调试成功)

'VB Base64 编码/加密函数:Function Base64Encode(Str() As Byte) As String                                  'Base64 编码On Error GoTo over                                                          '排错Dim buf() As Byte, length As Long, mods As LongConst B64_CHAR_DICT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="mods = (UBound(Str) + 1) Mod 3   '除以3的余数length = UBound(Str) + 1 - modsReDim buf(length / 3 * 4 + IIf(mods <> 0, 4, 0) - 1)Dim i As LongFor i = 0 To length - 1 Step 3buf(i / 3 * 4) = (Str(i) And &HFC) / &H4buf(i / 3 * 4 + 1) = (Str(i) And &H3) * &H10 + (Str(i + 1) And &HF0) / &H10buf(i / 3 * 4 + 2) = (Str(i + 1) And &HF) * &H4 + (Str(i + 2) And &HC0) / &H40buf(i / 3 * 4 + 3) = Str(i + 2) And &H3FNextIf mods = 1 Thenbuf(length / 3 * 4) = (Str(length) And &HFC) / &H4buf(length / 3 * 4 + 1) = (Str(length) And &H3) * &H10buf(length / 3 * 4 + 2) = 64buf(length / 3 * 4 + 3) = 64ElseIf mods = 2 Thenbuf(length / 3 * 4) = (Str(length) And &HFC) / &H4buf(length / 3 * 4 + 1) = (Str(length) And &H3) * &H10 + (Str(length + 1) And &HF0) / &H10buf(length / 3 * 4 + 2) = (Str(length + 1) And &HF) * &H4buf(length / 3 * 4 + 3) = 64End IfFor i = 0 To UBound(buf)Base64Encode = Base64Encode + Mid(B64_CHAR_DICT, buf(i) + 1, 1)Next
over:
End Function
'VB Base64 解码/解密函数:Function Base64Decode(B64 As String) As Byte()                                  'Base64 解码On Error GoTo over                                                          '排错Dim OutStr() As Byte, i As Long, j As LongConst B64_CHAR_DICT = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="If InStr(1, B64, "=") <> 0 Then B64 = Left(B64, InStr(1, B64, "=") - 1)     '判断Base64真实长度,除去补位Dim length As Long, mods As Longmods = Len(B64) Mod 4length = Len(B64) - modsReDim OutStr(length / 4 * 3 - 1 + Switch(mods = 0, 0, mods = 2, 1, mods = 3, 2))For i = 1 To length Step 4Dim buf(3) As ByteFor j = 0 To 3buf(j) = InStr(1, B64_CHAR_DICT, Mid(B64, i + j, 1)) - 1            '根据字符的位置取得索引值NextOutStr((i - 1) / 4 * 3) = buf(0) * &H4 + (buf(1) And &H30) / &H10OutStr((i - 1) / 4 * 3 + 1) = (buf(1) And &HF) * &H10 + (buf(2) And &H3C) / &H4OutStr((i - 1) / 4 * 3 + 2) = (buf(2) And &H3) * &H40 + buf(3)NextIf mods = 2 ThenOutStr(length / 4 * 3) = (InStr(1, B64_CHAR_DICT, Mid(B64, length + 1, 1)) - 1) * &H4 + ((InStr(1, B64_CHAR_DICT, Mid(B64, length + 2, 1)) - 1) And &H30) / 16ElseIf mods = 3 ThenOutStr(length / 4 * 3) = (InStr(1, B64_CHAR_DICT, Mid(B64, length + 1, 1)) - 1) * &H4 + ((InStr(1, B64_CHAR_DICT, Mid(B64, length + 2, 1)) - 1) And &H30) / 16OutStr(length / 4 * 3 + 1) = ((InStr(1, B64_CHAR_DICT, Mid(B64, length + 2, 1)) - 1) And &HF) * &H10 + ((InStr(1, B64_CHAR_DICT, Mid(B64, length + 3, 1)) - 1) And &H3C) / &H4End IfBase64Decode = OutStr                                                       '读取解码结果
over:
End Function

五、函数调用实例

Private Sub Command1_Click()Dim sou_code() As ByteDim des_code() As ByteDim sou_str, des_str As StringDim i, kk As Integersou_str = "ABCAB"kk = Len(sou_str) - 1ReDim sou_code(kk)For i = 0 To kksou_code(i) = Asc(Mid(sou_str, i + 1, 1))Next ikk = UBound(sou_code)des_str = Base64Encode(sou_code())MsgBox "Encode: " & des_strdes_code = Base64Decode(des_str)MsgBox "Decode: " & des_code(0) & des_code(1) & des_code(2) & des_code(3) & des_code(4) '& des_code(5)des_str = ""For i = 0 To kkdes_str = des_str & Chr(des_code(i))Next iMsgBox des_str
End Sub

六、结语

如果仅仅是实现二进制数据用文本方式传输,最简单的编码就是将每个字节用16进制表示,这样只用到16个字符(0-9,A-F)就可以了,不过,1个字节的数据变成2个字节,数据量增加了一倍;Base64编码后,3个字节的数据变成4个字节,数据量只增加了三分之一,兼顾了简单和效率。

Base64编码最早是用于电子邮件传输二进制数据用的,因为电子邮件只能传输文本,通过这个方法将二进制数据转换成文本,到接收端再还原。因此,BASE64字符表是标准的(见上面标准字符表),如果这个字符表是非标的,也就是自己弄一个乱序的字符表,就可以实现简单的加密和解密了。

VB实现Base64 编解码相关推荐

  1. base64编码 vba_【VBA研究】如何用Base64 编解码方法实现简单的加解密

    Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输.由于编码简单,所以很容易实现,代码也是现成的.利用这个编码规则可以实现简单的加解密.编解码方 ...

  2. 通过OpenSSL的接口实现Base64编解码

    对openssl genrsa产生的rsa私钥pem文件,使用普通的base64解码会有问题,如使用https://blog.csdn.net/fengbingchun/article/details ...

  3. Java实现BASE64编解码

    Java实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs BASE64和其它类似的编码算法通经常使用于转换二进制数据为文本数据,其目 ...

  4. python 图片base64 编解码,转换成Opencv,PIL.Image图片格式

    Python PIL.Image和OpenCV图像格式相互转换 二进制打开图片文件,base64编解码转成Opencv格式: # coding: utf-8 import base64 import ...

  5. Delphi 自带的 Base64 编解码函数

    今天帮别人解决一个关于 Base64 编解码的问题,竟然发现 Delphi 自带了 Base64 编解码的单元,叫 EncdDecd,这名字很拗口而且不直观,估计这是一直很少人关注和知道的原因. 这个 ...

  6. Java 8实现BASE64编解码

    Java 8实现BASE64编解码 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Java一直缺少BASE64编码 API,以至于通常在项目开发中会选用 ...

  7. Notepad++插件Base64编解码

    我们平常进行Base64编码需要自己写代码转换, 或者使用其他人编写的小工具程序, 也可以使用在线base64编码工具, 现在我们还可以使用Notepad++自带的插件, 进行Base64编码和解码, ...

  8. Python学习教程:Python3内置模块之base64编解码方法小结

    Python学习教程:Python3内置模块之base64编解码方法小结 概述 Base64 是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64 就是一种基于 64 个可打印字符来 ...

  9. ubuntu下c++中base64编解码测试和图片编解码测试

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 字符数组的base64编解码 base64.h #include <string>std::string base64_encode(un ...

最新文章

  1. boost::geometry::within用法的测试程序
  2. 各种服务常用端口号的含义
  3. 信息学奥赛一本通(1223:An Easy Problem)
  4. Emmet 语法 速查表
  5. 快狗打车通过港交所上市聆讯
  6. Mandelbrot vs Julia
  7. 在Hisi3531环境中为wm8978芯片添加音量调节功能及测试
  8. java rrd_java利用rrd4j做服务监控的图片
  9. 微信公众号系列之测试号使用
  10. 到底什么是阿里味?能否在不加入阿里的时候可以体验一下
  11. 自动生成python接口文档_Django自动生成Swagger接口文档
  12. 因执迷而绽放,终登聆听贡献者荣誉榜
  13. Flutter 平移动画 — 4种实现方式
  14. 图灵机器人 mysql_如何在微信小程序中制作图灵机器人?
  15. Windows与Linux的MYSQL UDF提权分析
  16. 【ERP】实践3_会计科目_凭证_期初余额
  17. 基于C++的考试试卷成绩管理系统
  18. 大数据早报:甲骨文公司投资4300万美元在总部建高中 18项全球互联网领先科技成果公布中国占6成 (12.6)...
  19. 2017产品经理白皮书
  20. 怎么用java做一个立体相册_抖音上很火的3D立体动态相册实现教程!(不懂编程也能学会)...

热门文章

  1. 《Effective Modern C++》读书笔记
  2. 钓鱼比赛(平均概率公式:1 - (1-p)^ t)----百度2016研发工程师在线编程题
  3. 机会,从来都是留给有准备的你
  4. python将一张图片转换为视频
  5. Matlab画图并在图中标记数据点
  6. 使用cv2.fisheye.calibrate标定时出现的错误:(-215:Assertion failed)
  7. 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include pch.h”
  8. 如何批量制作九宫格效果的视频
  9. C语言printf() 详解之终极无惑
  10. sqlserver2016安装包msi安装