ll_j 发表于 2005-7-14 15:13:46

[LISP函数]:进制转换

本帖最后由 ScmTools 于 2013-4-29 20:52 编辑

关于“进制转换”,在明经通道(http://mjtd.com/function/index.a ... &ordertype=byletter)
有这种程序,写的不错。
我将两个程序集合了以下,组成一个可以任意转换的函数,随意玩玩,其实没有什么意思。

(defun baseToDecimal (base val / pos power result tmp)   ;明经通道函数
(setq      pos    (1+ (strlen val))
      power-1
      result 0
      val    (strcase val)
)
(while (> (setq pos (1- pos)) 0)
    (setq result
         (+
             result
             (*      (if (> (setq tmp (ascii (substr val pos 1))) 64)
                  (- tmp 55)
                  (- tmp 48)
                )
                (expt base (setq power (1+ power)))
             )
         )
    )
)
result
)

(defun decimalToBase (base val / result tmp)   ;明经通道函数
(setq result "")
(while (> val 0)
    (setq result (strcat (if (> (setq tmp (rem val base)) 9)
                           (chr (+ tmp 55))
                           (itoa tmp)
                         )
                         result
               )
          val         (fix (/ val base))
    )
)
result
)

(defun base1tobase2 (val base1 base2 / result)   ;组合函数
(cond
    ((and (= (type val) 'INT) (= base1 10))
   (setq result (decimalToBase base2 val))
    )
    ((and (= (type val) 'STR) (= base1 10))
   (setq result (decimalToBase base2 (read val)))
    )
    ((= (type val) 'STR)
   (setq result (decimalToBase base2 (baseToDecimal base1 val)))
    )
    (t nil)
)
(if (= base2 10) (read result) result)
)

playboy 发表于 2005-11-23 10:27:31

不知道怎么用啊

goldoxhf 发表于 2009-8-22 13:13:15

不知道怎么用啊

XD0001 发表于 2013-5-1 13:16:08

谢谢LZ的分享,终于找到了

yjch 发表于 2013-6-12 12:58:13

谢谢你的归纳与整理,有心人也学到了东西

cabinsummer 发表于 2020-7-21 16:24:03

16进制字符串转10进制整数
(defun hex2dec(hex / map lst len p)
(setq map (vl-string->list "0123456789ABCDEF"))
(setq lst (mapcar '(lambda(x)(vl-position x map)) (vl-string->list (strcase hex))))
(setq len (length lst))
(setq p 0)
(if (< len 8)
    (apply '+ (mapcar '(lambda(x)(lsh x (* 4 (- len (setq p (1+ p)))))) lst))
    "最多转7位16进制字符串"
)
)
页: [1]
查看完整版本: [LISP函数]:进制转换