纯lisp实现更高效的base64编码解码
大海发了个纯算法实现base64编码解码,我也凑凑热闹,发一个更高效的base64编码解码。tryhi 发表于 2024-6-17 19:33
确实,除非很特殊的环境下没法使用组件,否则还是调用系统组卷更快更可靠
通过base64_encode加密一下,多了一个77u/,而这个东西就是传说中的Bom头了,正常情况下这个头是不会显示出来的,如果显示出来就固定的移除4位字符串就行
转载至 : https://blog.csdn.net/qq_38421226/article/details/106264751
本帖最后由 dcl1214 于 2024-6-16 17:47 编辑
原谅我给你做了一下容错处理(预防系统组件调用失败)
(defun $Base64Encode$ (str / onode oxml value $Stream_StringToBinary$)
;;;调用示例:($Base64Encode$ "龙哥威武")
(defun $Stream_StringToBinary$ (str / ado var)
(setq ADO (vl-catch-all-apply
'vlax-get-or-create-object
(list "ADODB.Stream")
)
)
(if (not (vl-catch-all-error-p ADO))
(progn
(vl-catch-all-apply 'vlax-put-property (list ADO 'Type 2))
(vl-catch-all-apply
'vlax-put-property
(list ADO 'CharSet "utf-8")
)
(vl-catch-all-apply 'Vlax-Invoke (list ADO 'Open))
(vl-catch-all-apply 'vlax-invoke (list ADO 'WriteText str))
(vl-catch-all-apply
'vlax-put-property
(list ADO 'Position 0)
)
(vl-catch-all-apply 'vlax-put-property (list ADO 'Type 1))
(vl-catch-all-apply
'vlax-put-property
(list ADO 'Position 0)
)
(setq var (vl-catch-all-apply
'vlax-invoke-method
(list ADO 'read -1)
)
)
(if (vl-catch-all-error-p var)
(setq var nil)
)
(vl-catch-all-apply 'vlax-release-object (list ADO))
)
)
var
)
(if (and str (= (type str) 'str))
(progn
(setq oXML (vl-catch-all-apply
'vlax-get-or-create-object
(list "Msxml2.DOMDocument.3.0")
)
)
(if (not (vl-catch-all-error-p oXML))
(progn
(setq oNode (vl-catch-all-apply
'vlax-invoke-method
(list oXML 'CreateElement "base64")
)
)
(vl-catch-all-apply
'vlax-put-property
(list oNode 'dataType "bin.base64")
)
(vl-catch-all-apply
'vlax-put-property
(list
oNode
'nodeTypedValue
($Stream_StringToBinary$ str)
)
)
(setq value
(vl-catch-all-apply 'vlax-get-property (list oNode 'text))
)
(if (vl-catch-all-error-p value)
(setq value "")
)
(vl-catch-all-apply 'vlax-release-object (list oNode))
(vl-catch-all-apply 'vlax-release-object (list oXML))
)
)
)
)
value
)
(defun $Base64Decode$ (str / onode oxml str-new)
;;;调用示例:($Base64Decode$ ($Base64Encode$ "龙哥威武"))
(defun $Stream_BinaryToString$ (var / ado var)
(setq ADO (vl-catch-all-apply
'vlax-get-or-create-object
(list "ADODB.Stream")
)
)
(if (not (vl-catch-all-error-p ADO))
(progn
(vl-catch-all-apply 'vlax-put-property (list ADO 'Type 1))
(vl-catch-all-apply 'Vlax-Invoke (list ADO 'Open))
(vl-catch-all-apply
'vlax-invoke-method
(list ADO 'Write var)
)
(vl-catch-all-apply
'vlax-put-property
(list ADO 'Position 0)
)
(vl-catch-all-apply 'vlax-put-property (list ADO 'Type 2))
(vl-catch-all-apply
'vlax-put-property
(list ADO 'CharSet "utf-8")
)
(setq str (vl-catch-all-apply
'vlax-invoke-method
(list ADO 'ReadText -1)
)
)
(vl-catch-all-apply 'vlax-release-object (list ADO))
)
)
str
)
(setq oXML (vl-catch-all-apply
'vlax-get-or-create-object
(list "Msxml2.DOMDocument.3.0")
)
)
(if (not (vl-catch-all-error-p oXML))
(progn
(setq oNode (vl-catch-all-apply
'vlax-invoke-method
(list oXML 'CreateElement "base64")
)
)
(vl-catch-all-apply
'vlax-put-property
(list oNode 'dataType "bin.base64")
)
(vl-catch-all-apply
'vlax-put-property
(list oNode 'text str)
)
(setq str-new ($Stream_BinaryToString$
(vlax-get-property oNode 'nodeTypedValue)
)
)
(if (vl-catch-all-error-p str-new)
(setq str-new "")
)
(if str-new
(setq str str-new)
)
(vl-catch-all-apply 'vlax-release-object (list oNode))
(vl-catch-all-apply 'vlax-release-object (list oXML))
)
)
str
)
本帖最后由 tryhi 于 2024-6-17 13:18 编辑
kozmosovia 发表于 2024-6-16 18:36
调用组件感觉上不应该比直接内部数学运算更快。
理论上这样讲确实没错,但是CAD的alisp的运算速度真的非常非常慢,从而导致根本打不过调用组件
另外楼主的函数都是UTF-8编码,如果要用ANSI编码的话,参数改为gb2312即可
有啥不一样的地方 这个调用了系统组件,可能速度要比lisp快一点 BASE64加盐试试 dcl1214 发表于 2024-6-16 17:24
这个调用了系统组件,可能速度要比lisp快一点
调用组件感觉上不应该比直接内部数学运算更快。 看看不说话........:lol 感谢大佬们的研究和分享! 哈哈,感谢分享,就稀罕这样的神仙打架。
页:
[1]
2