001.
002.
003.
004.
005.
006.
007.
008.
009.
010.
011.
012.
013.
014.
015.
016.
017.
018.
019.
020.
021.
022.
023.
024.
025.
026.
027.
028.
029.
030.
031.
032.
033.
034.
035.
036.
037.
038.
039.
040.
041.
042.
043.
044.
045.
046.
047.
048.
049.
050.
051.
052.
053.
054.
055.
056.
057.
058.
059.
060.
061.
062.
063.
064.
065.
066.
067.
068.
069.
070.
071.
072.
073.
074.
075.
076.
077.
078.
079.
080.
081.
082.
083.
084.
085.
086.
087.
088.
089.
090.
091.
092.
093.
094.
095.
096.
097.
098.
099.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
| ;(setq s "tPO80rrDw7Sjvw==") "大家好么?"
;(setq a (vl-list->string (EF:Base64-decode s nil)))
;(setq b (EF:Base64-encode (vl-string->list s) nil))
(setq $EF_Base64
'("A" "B" "C" "D" "E" "F" "G" "H"
"I" "J" "K" "L" "M" "N" "O" "P"
"Q" "R" "S" "T" "U" "V" "W" "X"
"Y" "Z" "a" "b" "c" "d" "e" "f"
"g" "h" "i" "j" "k" "l" "m" "n"
"o" "p" "q" "r" "s" "t" "u" "v"
"w" "x" "y" "z" "0" "1" "2" "3"
"4" "5" "6" "7" "8" "9" "+" "/"
"=" ;空位替代符
)
)
;Base64编码
;当code为nil时,使用默认编码
(defun EF:Base64-encode (lst ;字节流列表 '(65 23 11 64 ...)
code ;编码方案,当为nil时使用标准编码方案
/
Base64
nullchar
str
)
(if (null code) (setq code $EF_Base64))
(setq nullchar (last code))
(setq str "")
(defun Base64 (lst / i1 i2 i3) ;lst 字符串Ascii码列表 最多3项
(setq i1 (car lst)
i2 (cadr lst)
i3 (caddr lst)
)
(cond (i3
(mapcar '(lambda (e) (nth e code))
(list (lsh i1 -2)
(+ (* (Boole 1 i1 3) 16) (/ i2 16))
(+ (* (Boole 1 i2 15) 4) (/ i3 64))
(Boole 1 i3 63)
)
)
)
(i2
(append (mapcar '(lambda (e) (nth e code))
(list (lsh i1 -2)
(+ (* (Boole 1 i1 3) 16) (/ i2 16))
(* (Boole 1 i2 15) 4)
)
)
(list nullchar)
)
)
(i1
(append (mapcar '(lambda (e) (nth e code))
(list (lsh i1 -2)
(* (Boole 1 i1 3) 16)
)
)
(list nullchar nullchar)
)
)
)
)
(while lst
(setq str (apply 'strcat (cons str (Base64 (list (car lst) (cadr lst) (caddr lst)))))
lst (cdddr lst)
)
)
str
)
;Base64解码,返回原始数据的 字节流列表
(defun EF:Base64-decode (str code /
deBase64
nullchar str
i lst)
(if (null code) (setq code $EF_Base64))
(setq nullchar (last code))
(setq i -1)
(setq code (mapcar '(lambda (e) (cons (ascii e) (setq i (1+ i)))) code))
(defun deBase64 (str / lst i1 i2 i3) ;str 四字节字符串
(setq lst (mapcar '(lambda (e)
(cdr (assoc e code))
)
(vl-remove (ascii nullchar) (vl-string->list str))
))
(and (setq i1 (+ (lsh (car lst) 2) (lsh (cadr lst) -4)))
(setq lst (cdr lst))
(cadr lst)
(setq i2 (+ (lsh (boole 1 (car lst) 15) 4) (lsh (cadr lst) -2)))
(setq lst (cdr lst))
(cadr lst)
(setq i3 (+ (lsh (boole 1 (car lst) 3) 6) (cadr lst)))
)
(vl-remove nil (list i1 i2 i3))
)
(while (/= str "")
(setq lst (cons (deBase64 (substr str 1 4)) lst)
str (substr str 5)
)
)
(apply 'append (reverse lst))
)
|