易语言Base64编码及解码

 

子程序名 返回值类型 公开 备注
BASE64编码 文本型
BASE64编码处理(返回编码后的文本)
参数名 类型 参考 可空 数组 备注
待编码数据 字节集 待编码字节集
变量名 类型 静态 数组 备注
余数
临时 字节型 3
变量
集合 字节集
长度 整数型
字符 字节集
i
长度 = 取字节集长度 (待编码数据)
如果真 (长度 < 1)
    返回 (“”)
如果真结束
余数 = 长度 % 3
如果真 (余数 > 0)
    待编码数据 = 待编码数据 + 取空白字节集 (3 - 余数)
如果真结束
长度 = 取字节集长度 (待编码数据)
字符 = 取空白字节集 (长度 × 4 ÷ 3)
i = 1
集合 = 到字节集 (“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”)
变量循环首 (1, 长度, 3, 变量)
    临时 [1] = 待编码数据 [变量]
    临时 [2] = 待编码数据 [变量 + 1]
    临时 [3] = 待编码数据 [变量 + 2]
    字符 [i] = 集合 [右移 (临时 [1], 2) + 1]
    字符 [i + 1] = 集合 [左移 (位与 (临时 [1], 3), 4) + 右移 (临时 [2], 4) + 1]
    字符 [i + 2] = 集合 [左移 (位与 (临时 [2], 15), 2) + 右移 (临时 [3], 6) + 1]
    字符 [i + 3] = 集合 [位与 (临时 [3], 63) + 1]
    i = i + 4
变量循环尾 ()
如果真 (余数 > 0)
    长度 = 取字节集长度 (字符)
    如果 (余数 = 1)
        字符 [长度 - 1] = 取代码 (“=”, )
        字符 [长度] = 取代码 (“=”, )
    否则
        字符 [长度] = 取代码 (“=”, )
    如果结束
如果真结束
返回 (到文本 (字符))
子程序名 返回值类型 公开 备注
BASE64解码解码 字节集
BASE64解码处理(返回解码后的字节集数据)
参数名 类型 参考 可空 数组 备注
编码文本 文本型
待解码的文本
变量名 类型 静态 数组 备注
文本长度
整倍数
三字节组 字节型 3
四字节组 字节型 4
编码值
X
n
二进制数据 字节集
编码文本 = 删全部空 (编码文本)
编码文本 = 子文本替换 (编码文本, #换行符, , , , 真)
文本长度 = 取文本长度 (编码文本)
整倍数 = 文本长度 \ 4
如果真 (文本长度 % 4 ≠ 0)
    整倍数 = 整倍数 + 1
如果真结束
计次循环首 (整倍数, X)
    计次循环首 (4, n)
        四字节组 [n] = 取代码 (编码文本, (X - 1) × 4 + n)
        编码值 = 寻找文本 (“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”字符 (四字节组 [n]), , 假)
        如果真 (编码值 = -1)
            跳出循环 ()
        如果真结束
        四字节组 [n] = 编码值 - 1
    计次循环尾 ()
    三字节组 [1] = 位或 (四字节组 [1] × 4, 四字节组 [2] ÷ 16)
    三字节组 [2] = 位或 (四字节组 [2] × 16, 四字节组 [3] ÷ 4)
    三字节组 [3] = 位或 (四字节组 [3] × 64, 四字节组 [4])
    二进制数据 = 二进制数据 + 到字节集 (三字节组)
    处理事件 ()
计次循环尾 ()
如果真 (n < 5)  ‘ 最后一组4字符是提前退出的,截取字节集
    n = 5 - n
    二进制数据 = 取字节集左边 (二进制数据, 取字节集长度 (二进制数据) - n)
如果真结束
返回 (二进制数据)
‘ 此源码出自 YXZ’s Blog http://yxz.me/ 转载请保留此句
‘ Transformed by YXZ’s e-Assist

下面是易语言源代码,请直接复制使用!
.版本 2

.子程序 BASE64编码, 文本型, 公开, BASE64编码处理(返回编码后的文本)
.参数 待编码数据, 字节集, , 待编码字节集
.局部变量 余数
.局部变量 临时, 字节型, , “3”
.局部变量 变量
.局部变量 集合, 字节集
.局部变量 长度, 整数型
.局部变量 字符, 字节集
.局部变量 i

长度 = 取字节集长度 (待编码数据)
.如果真 (长度 < 1)
返回 (“”)
.如果真结束
余数 = 长度 % 3
.如果真 (余数 > 0)
待编码数据 = 待编码数据 + 取空白字节集 (3 - 余数)
.如果真结束
长度 = 取字节集长度 (待编码数据)
字符 = 取空白字节集 (长度 × 4 ÷ 3)
i = 1
集合 = 到字节集 (“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”)
.变量循环首 (1, 长度, 3, 变量)
临时 [1] = 待编码数据 [变量]
临时 [2] = 待编码数据 [变量 + 1]
临时 [3] = 待编码数据 [变量 + 2]
字符 [i] = 集合 [右移 (临时 [1], 2) + 1]
字符 [i + 1] = 集合 [左移 (位与 (临时 [1], 3), 4) + 右移 (临时 [2], 4) + 1]
字符 [i + 2] = 集合 [左移 (位与 (临时 [2], 15), 2) + 右移 (临时 [3], 6) + 1]
字符 [i + 3] = 集合 [位与 (临时 [3], 63) + 1]
i = i + 4
.变量循环尾 ()
.如果真 (余数 > 0)
长度 = 取字节集长度 (字符)
.如果 (余数 = 1)
字符 [长度 - 1] = 取代码 (“=”, )
字符 [长度] = 取代码 (“=”, )
.否则
字符 [长度] = 取代码 (“=”, )
.如果结束

.如果真结束
返回 (到文本 (字符))

.子程序 BASE64解码解码, 字节集, 公开, BASE64解码处理(返回解码后的字节集数据)
.参数 编码文本, 文本型, 参考, 待解码的文本
.局部变量 文本长度
.局部变量 整倍数
.局部变量 三字节组, 字节型, , “3”
.局部变量 四字节组, 字节型, , “4”
.局部变量 编码值
.局部变量 X
.局部变量 n
.局部变量 二进制数据, 字节集

编码文本 = 删全部空 (编码文本)
编码文本 = 子文本替换 (编码文本, #换行符, , , , 真)
文本长度 = 取文本长度 (编码文本)
整倍数 = 文本长度 \ 4
.如果真 (文本长度 % 4 ≠ 0)
整倍数 = 整倍数 + 1
.如果真结束
.计次循环首 (整倍数, X)
.计次循环首 (4, n)
四字节组 [n] = 取代码 (编码文本, (X - 1) × 4 + n)
编码值 = 寻找文本 (“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”, 字符 (四字节组 [n]), , 假)
.如果真 (编码值 = -1)
跳出循环 ()
.如果真结束
四字节组 [n] = 编码值 - 1
.计次循环尾 ()
三字节组 [1] = 位或 (四字节组 [1] × 4, 四字节组 [2] ÷ 16)
三字节组 [2] = 位或 (四字节组 [2] × 16, 四字节组 [3] ÷ 4)
三字节组 [3] = 位或 (四字节组 [3] × 64, 四字节组 [4])
二进制数据 = 二进制数据 + 到字节集 (三字节组)
处理事件 ()
.计次循环尾 ()
.如果真 (n < 5)  ′ 最后一组4字符是提前退出的,截取字节集
n = 5 - n
二进制数据 = 取字节集左边 (二进制数据, 取字节集长度 (二进制数据) - n)
.如果真结束
返回 (二进制数据)

′ 此源码出自 YXZ′s Blog http://yxz.me/ 转载请保留此句

原创文章,转载请注明: 转载自YXZ’s Blog

本文链接地址: 易语言Base64编码及解码

4 Responses

  1. ★Extreme★ 2013 年 4 月 29 日 / 下午 10:41

    啊,博主,这域名……
    话说文章太长了,上more标签吧。
    易语言这几年我都没怎么用了……

  2. yxzyxz001 2013 年 4 月 30 日 / 下午 7:23

    额,那个本来软件自动加的。。。。好像有点问题@★Extreme★:

  3. sunshaking 2013 年 10 月 21 日 / 上午 9:38

    老兄,易语言,不停切换全角、半角,累不累啊?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>