9609759 发表于 2024-6-16 14:23:47

纯lisp实现更高效的base64编码解码

大海发了个纯算法实现base64编码解码,我也凑凑热闹,发一个更高效的base64编码解码。

9609759 发表于 2024-6-24 08:52:08

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:44:25

本帖最后由 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:16:38

本帖最后由 tryhi 于 2024-6-17 13:18 编辑

kozmosovia 发表于 2024-6-16 18:36
调用组件感觉上不应该比直接内部数学运算更快。
理论上这样讲确实没错,但是CAD的alisp的运算速度真的非常非常慢,从而导致根本打不过调用组件

另外楼主的函数都是UTF-8编码,如果要用ANSI编码的话,参数改为gb2312即可

烟盒迷唇 发表于 2024-6-16 15:03:46

有啥不一样的地方

dcl1214 发表于 2024-6-16 17:24:17

这个调用了系统组件,可能速度要比lisp快一点

dcl1214 发表于 2024-6-16 17:28:07

BASE64加盐试试

kozmosovia 发表于 2024-6-16 18:36:11

dcl1214 发表于 2024-6-16 17:24
这个调用了系统组件,可能速度要比lisp快一点

调用组件感觉上不应该比直接内部数学运算更快。

迷失1786 发表于 2024-6-16 19:58:27

看看不说话........:lol

guosheyang 发表于 2024-6-16 21:22:07

感谢大佬们的研究和分享!

Bao_lai 发表于 2024-6-16 22:02:12

哈哈,感谢分享,就稀罕这样的神仙打架。
页: [1] 2
查看完整版本: 纯lisp实现更高效的base64编码解码