[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)
) 不知道怎么用啊 不知道怎么用啊 谢谢LZ的分享,终于找到了 谢谢你的归纳与整理,有心人也学到了东西 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]