找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 427|回复: 1

[源码] [TB-LISP函数]:文本的BASE64编码与解码

[复制链接]

已领礼包: 934个

财富等级: 财运亨通

发表于 2022-10-20 18:12:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 tengteb 于 2022-10-21 09:29 编辑

  ;参数:txt -- 文本;mode: nil -- 解码,其它 -- 编码

(defun TBC:Base64 (txt mode / Char Index Code Decode n m s ss a b c d zs lst)
  (defun Char (i)
    (cond
      ((<= 0 i 25) (+ i 65)) ;大写字母
      ((<= 26 i 51) (+ i 71)) ;小写字母
      ((<= 52 i 61) (- i 4)) ;数字
      ((= i 62) 43) ;+
      ((= i 63) 47) ;/
    ) ;cond
  ) ;defun
  (defun Index (a)
    (cond
      ((<= 65 a 90) (- a 65)) ;大写字母
      ((<= 97 a 122) (- a 71)) ;小写字母
      ((<= 48 a 57) (+ a 4)) ;数字
      ((= a 43) 62) ;+
      ((= a 47) 63) ;/
    ) ;cond
  ) ;defun
  (defun Code (n1 n2 n3)
    (list
      (lsh n1 -2)
      (+ (lsh (logand n1 3) 4) (lsh (logand n2 240) -4))
      (+ (lsh (logand n2 15) 2) (lsh (logand n3 192) -6))
      (logand n3 63)
    )
  ) ;defun
  (defun Decode (n1 n2 n3 n4)
    (list
      (+ (lsh n1 2) (lsh (logand n2 48) -4))
      (+ (lsh (logand n2 15) 4) (lsh (logand n3 60) -2))
      (+ (lsh (logand n3 3) 6) n4)
    )
  ) ;defun
  (setq lst (vl-string->list txt))
  (if mode ;nil:解码;else 编码
    (progn
      (setq n (length lst)
            m (rem n 3)
            n (/ n 3)
      )
      (or (= m 0) (setq n (1+ n)))
      (setq ss "")
      (repeat (- 3 m)
        (setq ss (strcat ss "=")
              zs (cons 0 zs)
        )
      ) ;repeat
      (setq lst (append lst zs))
      (setq s "")
      (repeat n
        (setq a   (car lst)
              b   (cadr lst)
              c   (caddr lst)
              lst (cdddr lst)
              s   (strcat s (vl-list->string (mapcar 'Char (Code a b c))))
        )
      ) ;repeat
      (setq n (strlen s))
      (strcat (substr s 1 (- n m)) ss)
    ) ;progn/else
    (progn
      (setq lst (vl-remove-if '(lambda (x) (= x 10)) lst)) ;允许编码中出现无用的换行符
      (setq m (length (member 61 lst))) ;"="及后面的长度
      (setq lst (mapcar 'Index (subst 65 61 lst))) ;"="替换为"A"
      (setq s "")
      (repeat (/ (length lst) 4)
        (setq a   (car lst)
              b   (cadr lst)
              c   (caddr lst)
              d   (cadddr lst)
              lst (cddddr lst)
              s   (strcat s (vl-list->string (Decode a b c d)))
        )
      )
      (setq n (strlen s))
      (substr s 1 (- n m))
    ) ;progn
  ) ;if
)

评分

参与人数 1D豆 +1 收起 理由
/db_自贡黄明儒_ + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2022-10-21 08:11:55 | 显示全部楼层
感谢分享!   
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-28 02:49 , Processed in 0.285809 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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