返回顶部

收藏

易语言Base64编码

更多

易语言Base64编码算法

字符串Base64编码

.版本 2

.程序集 窗口程序集1

.子程序 Base64编码, 字节集, 公开
.参数 原文, 字节集
.局部变量 余数, 整数型
.局部变量 三字节数据, 字节型, , "3"
.局部变量 码表, 字节集
.局部变量 len_x, 整数型
.局部变量 len_y, 整数型
.局部变量 结果, 字节集
.局部变量 i, 整数型
.局部变量 k, 整数型

len_x = 取字节集长度 (原文)
.如果真 (len_x < 1)
    返回 ({  })
.如果真结束
余数 = len_x % 3
.如果真 (余数 > 0)
    原文 = 原文 + 取空白字节集 (3 - 余数)
    len_x = len_x + 3 - 余数
.如果真结束
len_y = len_x × 4 ÷ 3
结果 = 取空白字节集 (len_y)
i = 1
码表 = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47 }
.变量循环首 (1, len_x, 3, k)
    三字节数据 [1] = 原文 [k]
    三字节数据 [2] = 原文 [k + 1]
    三字节数据 [3] = 原文 [k + 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
.变量循环尾 ()
.判断开始 (余数 = 2)
    结果 [len_y] = 61
.判断 (余数 = 1)
    结果 [len_y] = 61
    结果 [len_y - 1] = 61
.默认

.判断结束
返回 (结果)

.子程序 _按钮1_被单击

编辑框2.内容 = 到文本 (Base64编码 (到字节集 (编辑框1.内容)))

文件Base64编解码

.版本 2

.程序集 窗口程序集1

.子程序 BASE64编码, 文本型
.参数 二进制数据, 字节集, 参考
.局部变量 数据长度
.局部变量 整倍数
.局部变量 X
.局部变量 编码文本, 字节型, , "0"
.局部变量 行字数
.局部变量 三字节, 字节集
.局部变量 三字节组, 字节型, , "3"
.局部变量 四字节组, 字节型, , "4"
.局部变量 n
.局部变量 编码值
.局部变量 xx
.局部变量 指针

数据长度 = 取字节集长度 (二进制数据)
信息框 (“文件长度为” + 数值到格式文本 (数据长度, , 真) + “字节”, #信息图标, )
xx = 取启动时间 ()
整倍数 = 数据长度 \ 3
.如果真 (数据长度 % 3 ≠ 0)
    整倍数 = 整倍数 + 1
.如果真结束
重定义数组 (编码文本, 假, 整倍数 × 5)  ' 开辟缓冲区大小
指针 = 1
.计次循环首 (整倍数, X)
    三字节 = 取字节集中间 (二进制数据, (X - 1) × 3 + 1, 3)
    .计次循环首 (3, n)
        三字节组 [n] = 取字节集数据 (取字节集中间 (三字节, n, 1), #字节型)
    .计次循环尾 ()
    四字节组 [1] = 位与 (三字节组 [1], 252) ÷ 4
    四字节组 [2] = 位或 (位与 (三字节组 [1], 3) × 16, 三字节组 [2] ÷ 16)
    四字节组 [3] = 位或 (位与 (三字节组 [2], 15) × 4, 三字节组 [3] ÷ 64)
    四字节组 [4] = 位与 (三字节组 [3], 63)

    .计次循环首 (4, n)  ' 这里循环次数不用3,而用实际长度,考虑到数据长度不总是3的整倍数
        编码值 = 四字节组 [n] + 1
        编码文本 [指针 + n - 1] = 取代码 (“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”, 编码值)
        处理事件 ()
    .计次循环尾 ()
    ' 编码文本 = 编码文本 + 到文本 (四字节组)
    指针 = 指针 + 4
    行字数 = 行字数 + 4
    .如果真 (行字数 = 76)
        行字数 = 0
        编码文本 [指针] = 13
        编码文本 [指针 + 1] = 10
        指针 = 指针 + 2
        ' 编码文本 = 编码文本 + #换行符
    .如果真结束
    进度条1.位置 = X ÷ 整倍数 × 100
    处理事件 ()
.计次循环尾 ()
.如果真 (取字节集长度 (三字节) = 1)  ' 如果编码文本长度不是4的整倍数,后面补"="
    编码文本 [指针] = 取代码 (“=”, )
    编码文本 [指针 - 1] = 取代码 (“=”, )
.如果真结束
.如果真 (取字节集长度 (三字节) = 2)  ' 如果编码文本长度不是4,后面补"="
    编码文本 [指针] = 取代码 (“=”, )
.如果真结束
输出调试文本 (到文本 (取启动时间 () - xx))
返回 (到文本 (编码文本))

.子程序 _按钮1_被单击

.如果真 (通用对话框1.打开 ())
    编辑框1.内容 = BASE64编码 (读入文件 (通用对话框1.文件名))
.如果真结束

.子程序 BASE64解码, 字节集
.参数 编码文本, 文本型, 参考
.局部变量 文本长度
.局部变量 整倍数
.局部变量 三字节组, 字节型, , "3"
.局部变量 四字节组, 字节型, , "4"
.局部变量 编码值
.局部变量 X
.局部变量 n
.局部变量 二进制数据, 字节集
.局部变量 指针
.局部变量 字节数组, 字节型, , "0"

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

.子程序 _按钮2_被单击

.如果 (选择框1.选中)
    图片框1.图片 = BASE64解码 (编辑框1.内容)
.否则
    图片框1.图片 = BASE64解码 (编辑框2.内容)
.如果结束

.子程序 __启动窗口_创建完毕

标签1.标题 = “编辑框的内容是从邮件图片附件复制来的BASE编码文本,按下面按扭后就解码出原来的图片,并显示在图片框.看看是什么图片吧:-)”
编辑框2.内容 = 到文本 (#编码图片)

标签:其他编程语言

收藏

0人收藏

支持

0

反对

0

发表评论