找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 9979|回复: 6

【VB】VB写的Base64编码、解码工具

[复制链接]
发表于 2015-1-29 05:10:48 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
Base64的编码方式很简单,每3个8-bit字节转换为4个6-bit字节来存储,而每个6 bit字节都转换为64个可打印字符。字符表如下。
字符字符字符字符
0A17R34i51z
1B18S35j520
2C19T36k531
3D20U37l542
4E21V38m553
5F22W39n564
6G23X40o575
7H24Y41p586
8I25Z42q597
9J26a43r608
10K27b44s619
11L28c45t62+
12M29d46u63/
13N30e47v
14O31f48w
15P32g49x
16Q33h50y

Base64的存在,能使信息可以通过可打印ASCII码的方式存储,避免了各种冲突问题。比如我有一堆“回车”(CR LF)要通过电子邮件发送,为了避免服务器误解我的请求,我可以把它编码为Base64。
牺牲了体积,但是换来了灵活性。
20150129045022.png
  1. VERSION 5.00
  2. Begin VB.Form frmMain
  3.    Caption         =   "Base64"
  4.    ClientHeight    =   5190
  5.    ClientLeft      =   120
  6.    ClientTop       =   450
  7.    ClientWidth     =   8340
  8.    LinkTopic       =   "Form1"
  9.    ScaleHeight     =   346
  10.    ScaleMode       =   3  'Pixel
  11.    ScaleWidth      =   556
  12.    StartUpPosition =   3  '窗口缺省
  13.    Begin VB.PictureBox picCenterBar
  14.       Align           =   3  'Align Left
  15.       BorderStyle     =   0  'None
  16.       Height          =   5190
  17.       Left            =   3135
  18.       MousePointer    =   9  'Size W E
  19.       ScaleHeight     =   346
  20.       ScaleMode       =   3  'Pixel
  21.       ScaleWidth      =   8
  22.       TabIndex        =   4
  23.       Top             =   0
  24.       Width           =   120
  25.    End
  26.    Begin VB.PictureBox picBase64
  27.       Align           =   3  'Align Left
  28.       BorderStyle     =   0  'None
  29.       Height          =   5190
  30.       Left            =   3255
  31.       ScaleHeight     =   346
  32.       ScaleMode       =   3  'Pixel
  33.       ScaleWidth      =   232
  34.       TabIndex        =   2
  35.       Top             =   0
  36.       Width           =   3480
  37.       Begin VB.TextBox txtBase64
  38.          Height          =   2775
  39.          Left            =   0
  40.          MultiLine       =   -1  'True
  41.          ScrollBars      =   2  'Vertical
  42.          TabIndex        =   6
  43.          Top             =   240
  44.          Width           =   2655
  45.       End
  46.       Begin VB.Label lblBase64
  47.          AutoSize        =   -1  'True
  48.          Caption         =   "Base64编码:"
  49.          Height          =   180
  50.          Left            =   0
  51.          TabIndex        =   3
  52.          Top             =   0
  53.          Width           =   1080
  54.       End
  55.    End
  56.    Begin VB.PictureBox picSrc
  57.       Align           =   3  'Align Left
  58.       BorderStyle     =   0  'None
  59.       Height          =   5190
  60.       Left            =   0
  61.       ScaleHeight     =   346
  62.       ScaleMode       =   3  'Pixel
  63.       ScaleWidth      =   209
  64.       TabIndex        =   0
  65.       Top             =   0
  66.       Width           =   3135
  67.       Begin VB.TextBox txtSrc
  68.          Height          =   2895
  69.          Left            =   0
  70.          MultiLine       =   -1  'True
  71.          ScrollBars      =   2  'Vertical
  72.          TabIndex        =   5
  73.          Top             =   240
  74.          Width           =   3135
  75.       End
  76.       Begin VB.Label lblSrc
  77.          AutoSize        =   -1  'True
  78.          Caption         =   "原始信息:"
  79.          Height          =   180
  80.          Left            =   0
  81.          TabIndex        =   1
  82.          Top             =   0
  83.          Width           =   900
  84.       End
  85.    End
  86. End
  87. Attribute VB_Name = "frmMain"
  88. Attribute VB_GlobalNameSpace = False
  89. Attribute VB_Creatable = False
  90. Attribute VB_PredeclaredId = True
  91. Attribute VB_Exposed = False
  92. Option Explicit

  93. '字符串用UTF-8编码
  94. Private Const CP_UTF8 = 65001
  95. Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, lpWideCharStr As Any, ByVal cchWideChar As Long) As Long
  96. Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, lpWideCharStr As Any, ByVal cchWideChar As Long, lpMultiByteStr As Any, ByVal cchMultiByte As Long, lpDefaultChar As Any, ByVal lpUsedDefaultChar As Long) As Long

  97. Dim SW!, SH! '窗口宽度和高度
  98. Dim IsManagedChange As Boolean '确定是不是程序自身修改了文本框。防止循环修改。

  99. '将字符串转换为UTF-8编码的字节数组
  100. Sub StringToUTF8Bytes(Src As String, UTF8Bytes() As Byte)

  101. '先计算需求字节数
  102. Dim BytesRequired As Long
  103. BytesRequired = WideCharToMultiByte(CP_UTF8, 0, ByVal StrPtr(Src), Len(Src), ByVal 0, 0, ByVal 0, ByVal 0)

  104. '然后转换
  105. ReDim UTF8Bytes(BytesRequired - 1)
  106. WideCharToMultiByte CP_UTF8, 0, ByVal StrPtr(Src), Len(Src), UTF8Bytes(0), BytesRequired, ByVal 0, ByVal 0
  107. End Sub

  108. '将UTF-8编码的字节数组转换为字符串
  109. Function UTF8BytesToString(UTF8Bytes() As Byte) As String

  110. '先计算需求字节数
  111. Dim BytesRequired As Long
  112. BytesRequired = MultiByteToWideChar(CP_UTF8, 0, UTF8Bytes(0), UBound(UTF8Bytes) + 1, ByVal 0, 0)

  113. '然后转换
  114. UTF8BytesToString = String(BytesRequired, 0)
  115. MultiByteToWideChar CP_UTF8, 0, UTF8Bytes(0), UBound(UTF8Bytes) + 1, ByVal StrPtr(UTF8BytesToString), BytesRequired
  116. End Function

  117. '将6-bit字节转换为Base64字符
  118. Function EncBase64Char(ByVal Value As Byte) As Byte
  119. If Value < 26 Then '26个大写英文字母
  120.     EncBase64Char = Value + &H41
  121. ElseIf Value < 52 Then '26个小写英文字母
  122.     EncBase64Char = Value + &H61 - 26
  123. ElseIf Value < 62 Then '10个数字
  124.     EncBase64Char = Value + &H30 - 52
  125. ElseIf Value = 62 Then
  126.     EncBase64Char = &H2B '+
  127. Else
  128.     EncBase64Char = &H2F '/
  129. End If
  130. End Function

  131. '将Base64字符转换为6 bit字节
  132. Function DecBase64Char(ByVal Value As Byte) As Byte
  133. If Value >= &H41 And Value <= &H5A Then
  134.     DecBase64Char = Value - &H41
  135. ElseIf Value >= &H61 And Value <= &H7A Then
  136.     DecBase64Char = Value - &H61 + 26
  137. ElseIf Value >= &H30 And Value <= &H39 Then
  138.     DecBase64Char = Value - &H30 + 52
  139. ElseIf Value = &H2B Then
  140.     DecBase64Char = 62
  141. ElseIf Value = &H2F Then
  142.     DecBase64Char = 63
  143. End If
  144. End Function

  145. '进行Base64编码,返回Base64的字符串
  146. Function Encode(Src As String) As String
  147. On Error GoTo ErrHandler
  148. If Len(Src) = 0 Then Exit Function

  149. '原始内容
  150. Dim SrcBytes() As Byte, SrcLen As Long
  151. StringToUTF8Bytes Src, SrcBytes '先将原文以UTF-8的方式编码
  152. SrcLen = UBound(SrcBytes) + 1

  153. '编码后的内容
  154. Dim DestBytes() As Byte, DestLen As Long
  155. DestLen = SrcLen + ((SrcLen - 1) \ 3 + 1)
  156. ReDim DestBytes(DestLen - 1)

  157. '将8-bit字节数组转换为6-bit字节数组
  158. Dim I&, J&, Bit&
  159. For I = 0 To SrcLen - 1
  160.     If Bit = 0 Then 'DestBytes(J)未被写入
  161.         DestBytes(J) = (SrcBytes(I) And &HFC) \ &H4
  162.         J = J + 1
  163.         DestBytes(J) = (SrcBytes(I) And &H3) * &H10
  164.         Bit = 2
  165.         '234567
  166.         'NNNN01 'N:Next byte
  167.     ElseIf Bit = 2 Then 'DestBytes(J)已被写入两位
  168.         DestBytes(J) = DestBytes(J) Or ((SrcBytes(I) And &HF0) \ &H10)
  169.         J = J + 1
  170.         DestBytes(J) = (SrcBytes(I) And &HF) * &H4
  171.         Bit = 4
  172.         '4567PP 'P:Prev byte
  173.         'NN0123 'N:Next byte
  174.     ElseIf Bit = 4 Then 'DestBytes(J)已被写入四位
  175.         DestBytes(J) = DestBytes(J) Or ((SrcBytes(I) And &HC0) / &H40)
  176.         J = J + 1
  177.         DestBytes(J) = SrcBytes(I) And &H3F
  178.         J = J + 1
  179.         Bit = 0
  180.         '67PPPP 'P:Prev byte
  181.         '012345
  182.     End If
  183. Next

  184. For I = 0 To DestLen - 1
  185.     DestBytes(I) = EncBase64Char(DestBytes(I)) '转换为Base64字符
  186. Next
  187. Encode = StrConv(DestBytes, vbUnicode) & String(2 - (SrcLen - 1) Mod 3, "=") '原文剩余内容不足3个字节需要补齐
  188. Exit Function

  189. '出错返回错误描述。
  190. ErrHandler:
  191. Encode = Err.Description
  192. End Function

  193. '将Base64的字符串解码为原文。
  194. Function Decode(Src As String) As String
  195. On Error GoTo ErrHandler
  196. If Len(Src) = 0 Then Exit Function

  197. '编码后的内容
  198. Dim SrcBytes() As Byte, SrcLen As Long
  199. SrcBytes = StrConv(Src, vbFromUnicode)
  200. SrcLen = UBound(SrcBytes) + 1

  201. '原始内容
  202. Dim DestBytes() As Byte, DestLen As Long
  203. DestLen = SrcLen - SrcLen \ 4
  204. ReDim DestBytes(DestLen - 1)

  205. Dim I&, J&, Bit&
  206. For J = 0 To SrcLen - 1
  207.     SrcBytes(J) = DecBase64Char(SrcBytes(J)) '从Base64字符转换为6-bit字节
  208. Next
  209. '将6-bit字节数组转换为8-bit字节数组
  210. For J = 0 To DestLen - 1
  211.     If Bit = 0 Then 'DestBytes(J)未被写入
  212.         DestBytes(J) = SrcBytes(I) * &H4
  213.         I = I + 1
  214.         If I > UBound(SrcBytes) Then Exit For
  215.         DestBytes(J) = DestBytes(J) Or ((SrcBytes(I) And &H30) \ &H10)
  216.         Bit = 2
  217.     ElseIf Bit = 2 Then 'DestBytes(J)已被写入两字节
  218.         DestBytes(J) = (SrcBytes(I) And &HF) * &H10
  219.         I = I + 1
  220.         If I > UBound(SrcBytes) Then Exit For
  221.         DestBytes(J) = DestBytes(J) Or ((SrcBytes(I) And &H3C) \ &H4)
  222.         Bit = 4
  223.     ElseIf Bit = 4 Then 'DestBytes(J)已被写入四字节
  224.         DestBytes(J) = (SrcBytes(I) And &H3) * &H40
  225.         I = I + 1
  226.         If I > UBound(SrcBytes) Then Exit For
  227.         DestBytes(J) = DestBytes(J) Or SrcBytes(I)
  228.         I = I + 1
  229.         If I > UBound(SrcBytes) Then Exit For
  230.         Bit = 0
  231.     End If
  232. Next
  233. '最后将转换得到的UTF-8字符串转换为VB支持的Unicode字符串以便于显示。
  234. Decode = UTF8BytesToString(DestBytes)
  235. Exit Function
  236. ErrHandler:
  237. Decode = Err.Description
  238. End Function

  239. Private Sub Form_Load()
  240. Form_Resize
  241. End Sub

  242. '窗口大小更改时,左右两个文本框的宽度比例保持不变。
  243. Private Sub Form_Resize()
  244. On Error Resume Next
  245. SW = ScaleWidth
  246. SH = ScaleHeight

  247. Dim LWidth!, RWidth!, MWidth!
  248. LWidth = picSrc.Width
  249. RWidth = picBase64.Width
  250. MWidth = picCenterBar.Width

  251. picSrc.Width = (SW - MWidth) * LWidth / (LWidth + RWidth)
  252. picBase64.Width = (SW - MWidth) * RWidth / (LWidth + RWidth)
  253. End Sub

  254. '容器大小修改时,里面的文本框适应容器的尺寸。
  255. Private Sub picSrc_Resize()
  256. On Error Resume Next
  257. txtSrc.Move 0, txtSrc.Top, picSrc.ScaleWidth, picSrc.ScaleHeight - txtSrc.Top
  258. End Sub
  259. Private Sub picBase64_Resize()
  260. On Error Resume Next
  261. txtBase64.Move 0, txtBase64.Top, picBase64.ScaleWidth, picBase64.ScaleHeight - txtBase64.Top
  262. End Sub

  263. '中间的分隔,可以用鼠标拖动。鼠标按下时变暗。
  264. Private Sub picCenterBar_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  265. picCenterBar.BackColor = vbButtonShadow
  266. End Sub

  267. Private Sub picCenterBar_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  268. On Error Resume Next
  269. Static DragX!
  270. If Button And 1 Then '是否鼠标左键按下。
  271.     Dim NewWidth!, MWidth!
  272.     MWidth = picCenterBar.Width
  273.     NewWidth = picSrc.Width + (X - DragX)
  274.     '限制拖动的范围。
  275.     If NewWidth < 1 Then NewWidth = 1
  276.     If NewWidth > SW - MWidth - 1 Then NewWidth = SW - MWidth - 1
  277.     '调整UI尺寸
  278.     picSrc.Width = NewWidth
  279.     picBase64.Width = SW - MWidth - NewWidth
  280. Else
  281.     DragX = X
  282. End If
  283. End Sub

  284. '拖动停止时变回原来的颜色。
  285. Private Sub picCenterBar_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  286. picCenterBar.BackColor = vbButtonFace
  287. End Sub

  288. '修改文本框的时候。进行编码工作
  289. Private Sub txtSrc_Change()
  290. If IsManagedChange Then
  291.     IsManagedChange = False '防止循环修改
  292. Else
  293.     IsManagedChange = True
  294.     txtBase64.Text = ""
  295.     IsManagedChange = True
  296.     txtBase64.SelText = Encode(txtSrc.Text)
  297.     IsManagedChange = False
  298. End If
  299. End Sub

  300. '修改文本框的时候。进行解码工作
  301. Private Sub txtBase64_Change()
  302. If IsManagedChange Then
  303.     IsManagedChange = False '防止循环修改
  304. Else
  305.     IsManagedChange = True
  306.     txtSrc.Text = ""
  307.     IsManagedChange = True
  308.     txtSrc.SelText = Decode(txtBase64.Text)
  309.     IsManagedChange = False
  310. End If
  311. End Sub
复制代码
BIN: Base64编码转换.exe (32 KB, 下载次数: 26)
SRC: Base64.7z (9.79 KB, 下载次数: 49)
参考资料: rfc2045.7z (18.83 KB, 下载次数: 20)

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2016-10-2 20:57:50 | 显示全部楼层
居然让我坐了沙发?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2016-10-5 22:43:03 | 显示全部楼层
凌寒 发表于 2016-10-2 20:57
居然让我坐了沙发?

噗。。
回复 赞! 靠!

使用道具 举报

发表于 2016-11-17 10:30:52 | 显示全部楼层
支持    !!
回复 赞! 靠!

使用道具 举报

发表于 2016-11-17 10:31:13 | 显示全部楼层
支持    !!
回复 赞! 靠!

使用道具 举报

发表于 2020-7-7 16:01:54 | 显示全部楼层
本帖最后由 china_shy_wzb 于 2020-7-20 13:30 编辑

我来支持一下    !!
回复 赞! 靠!

使用道具 举报

发表于 2020-12-4 10:23:59 | 显示全部楼层
感谢分享。。。
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-23 17:47 , Processed in 0.040934 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表