明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1361|回复: 14

[函数] 纯lisp实现更高效的base64编码解码

[复制链接]
发表于 2024-6-16 14:23:47 | 显示全部楼层 |阅读模式
大海发了个纯算法实现base64编码解码,我也凑凑热闹,发一个更高效的base64编码解码。

本帖子中包含更多资源

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

x

评分

参与人数 3明经币 +2 金钱 +25 收起 理由
tryhi + 1 + 20 赞一个!
baitang36 + 1 很给力!
tigcat + 5 很给力!

查看全部评分

 楼主| 发表于 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
发表于 2024-6-16 17:44:25 | 显示全部楼层
本帖最后由 dcl1214 于 2024-6-16 17:47 编辑

原谅我给你做了一下容错处理(预防系统组件调用失败)
  1. (defun $Base64Encode$ (str / onode oxml value $Stream_StringToBinary$)
  2. ;;;调用示例$Base64Encode$ "龙哥威武")
  3.   (defun $Stream_StringToBinary$ (str / ado var)
  4.     (setq ADO (vl-catch-all-apply
  5.                 'vlax-get-or-create-object
  6.                 (list "ADODB.Stream")
  7.               )
  8.     )
  9.     (if        (not (vl-catch-all-error-p ADO))
  10.       (progn
  11.         (vl-catch-all-apply 'vlax-put-property (list ADO 'Type 2))
  12.         (vl-catch-all-apply
  13.           'vlax-put-property
  14.           (list ADO 'CharSet "utf-8")
  15.         )
  16.         (vl-catch-all-apply 'Vlax-Invoke (list ADO 'Open))
  17.         (vl-catch-all-apply 'vlax-invoke (list ADO 'WriteText str))
  18.         (vl-catch-all-apply
  19.           'vlax-put-property
  20.           (list ADO 'Position 0)
  21.         )
  22.         (vl-catch-all-apply 'vlax-put-property (list ADO 'Type 1))
  23.         (vl-catch-all-apply
  24.           'vlax-put-property
  25.           (list ADO 'Position 0)
  26.         )
  27.         (setq var (vl-catch-all-apply
  28.                     'vlax-invoke-method
  29.                     (list ADO 'read -1)
  30.                   )
  31.         )
  32.         (if (vl-catch-all-error-p var)
  33.           (setq var nil)
  34.         )
  35.         (vl-catch-all-apply 'vlax-release-object (list ADO))
  36.       )
  37.     )
  38.     var
  39.   )
  40.   (if (and str (= (type str) 'str))
  41.     (progn
  42.       (setq oXML (vl-catch-all-apply
  43.                    'vlax-get-or-create-object
  44.                    (list "Msxml2.DOMDocument.3.0")
  45.                  )
  46.       )
  47.       (if (not (vl-catch-all-error-p oXML))
  48.         (progn
  49.           (setq        oNode (vl-catch-all-apply
  50.                         'vlax-invoke-method
  51.                         (list oXML 'CreateElement "base64")
  52.                       )
  53.           )
  54.           (vl-catch-all-apply
  55.             'vlax-put-property
  56.             (list oNode 'dataType "bin.base64")
  57.           )
  58.           (vl-catch-all-apply
  59.             'vlax-put-property
  60.             (list
  61.               oNode
  62.               'nodeTypedValue
  63.               ($Stream_StringToBinary$ str)
  64.             )
  65.           )
  66.           (setq        value
  67.                  (vl-catch-all-apply 'vlax-get-property (list oNode 'text))
  68.           )
  69.           (if (vl-catch-all-error-p value)
  70.             (setq value "")
  71.           )
  72.           (vl-catch-all-apply 'vlax-release-object (list oNode))
  73.           (vl-catch-all-apply 'vlax-release-object (list oXML))
  74.         )
  75.       )
  76.     )
  77.   )
  78.   value
  79. )
  80. (defun $Base64Decode$ (str / onode oxml str-new)
  81. ;;;调用示例$Base64Decode$ ($Base64Encode$ "龙哥威武"))
  82.   (defun $Stream_BinaryToString$ (var / ado var)
  83.     (setq ADO (vl-catch-all-apply
  84.                 'vlax-get-or-create-object
  85.                 (list "ADODB.Stream")
  86.               )
  87.     )
  88.     (if        (not (vl-catch-all-error-p ADO))
  89.       (progn
  90.         (vl-catch-all-apply 'vlax-put-property (list ADO 'Type 1))
  91.         (vl-catch-all-apply 'Vlax-Invoke (list ADO 'Open))
  92.         (vl-catch-all-apply
  93.           'vlax-invoke-method
  94.           (list ADO 'Write var)
  95.         )
  96.         (vl-catch-all-apply
  97.           'vlax-put-property
  98.           (list ADO 'Position 0)
  99.         )
  100.         (vl-catch-all-apply 'vlax-put-property (list ADO 'Type 2))
  101.         (vl-catch-all-apply
  102.           'vlax-put-property
  103.           (list ADO 'CharSet "utf-8")
  104.         )
  105.         (setq str (vl-catch-all-apply
  106.                     'vlax-invoke-method
  107.                     (list ADO 'ReadText -1)
  108.                   )
  109.         )
  110.         (vl-catch-all-apply 'vlax-release-object (list ADO))
  111.       )
  112.     )
  113.     str
  114.   )
  115.   (setq        oXML (vl-catch-all-apply
  116.                'vlax-get-or-create-object
  117.                (list "Msxml2.DOMDocument.3.0")
  118.              )
  119.   )
  120.   (if (not (vl-catch-all-error-p oXML))
  121.     (progn
  122.       (setq oNode (vl-catch-all-apply
  123.                     'vlax-invoke-method
  124.                     (list oXML 'CreateElement "base64")
  125.                   )
  126.       )
  127.       (vl-catch-all-apply
  128.         'vlax-put-property
  129.         (list oNode 'dataType "bin.base64")
  130.       )
  131.       (vl-catch-all-apply
  132.         'vlax-put-property
  133.         (list oNode 'text str)
  134.       )
  135.       (setq str-new ($Stream_BinaryToString$
  136.                       (vlax-get-property oNode 'nodeTypedValue)
  137.                     )
  138.       )
  139.       (if (vl-catch-all-error-p str-new)
  140.         (setq str-new "")
  141.       )
  142.       (if str-new
  143.         (setq str str-new)
  144.       )
  145.       (vl-catch-all-apply 'vlax-release-object (list oNode))
  146.       (vl-catch-all-apply 'vlax-release-object (list oXML))
  147.     )
  148.   )
  149.   str
  150. )

发表于 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 | 显示全部楼层
有啥不一样的地方
发表于 2024-6-16 17:24:17 | 显示全部楼层
这个调用了系统组件,可能速度要比lisp快一点
发表于 2024-6-16 17:28:07 | 显示全部楼层
BASE64加盐试试
发表于 2024-6-16 18:36:11 | 显示全部楼层
dcl1214 发表于 2024-6-16 17:24
这个调用了系统组件,可能速度要比lisp快一点

调用组件感觉上不应该比直接内部数学运算更快。
发表于 2024-6-16 19:58:27 | 显示全部楼层
看看不说话........
发表于 2024-6-16 21:22:07 | 显示全部楼层
感谢大佬们的研究和分享!
发表于 2024-6-16 22:02:12 | 显示全部楼层
哈哈,感谢分享,就稀罕这样的神仙打架。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 16:01 , Processed in 0.208284 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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