转换十进制< - >十六进制

时间:2010-03-01 19:51:48

标签: elisp

给定一个十进制数列表,如何将每个数字转换为等效的十六进制值,反之亦然?

例如:

(convert2hex 255 64 64); -> (FF 40 40)
(convert2dec FF 40 40); -> (255 64 64)

(convert2hex 255 64 64 255 64 64 128)
(convert2dec FF 40 40 FF 40 40 80)

4 个答案:

答案 0 :(得分:30)

数字到十六进制:

(format "%X" 255) ;; => "FF"

您还可以使用以下内容对值进行填零:

(format "%03X" 255) ;; => "0FF"

0是用于填充的字符,3是要填充的空格数。

十六进制字符串到数字

(string-to-number "FF" 16) ;; => 255

16表示“读作基数为16。”

答案 1 :(得分:15)

如果您只想在Emacs中键入十六进制数字,则无需调用string-to-number,只需使用#x阅读器语法:

#xFF
==> 255

您也可以使用#b表示二进制数,#o表示八进制数,或#36r表示基数36:

#b10011001
==> 153
#o777
==> 511
#36rHELLO
==> 29234652

请参阅Emacs Lisp手册中的section 3.1 Integer Basics

答案 2 :(得分:1)

我有兴趣将八进制字符转换为源文件中的十六进制字符。

我想查询搜索并替换以下文字:

'\0'   -> "\\0", // Null
'\7'   -> "\\a", // Bell (^G)
'\b'   -> "\\b", // Backspace (^H)
'\13'  -> "\\v", // Vertical tab (^K)
'\33'  -> "\\e", // Escape (^[)

这是正则表达式搜索和替换

C-米 - %

'\\\([0-9]+\)'

RET

'\,(format "\\0x%04X" (string-to-number \1 8))'

RET

结果是:

'\0x0000' -> "\\0", // Null
'\0x0007' -> "\\a", // Bell (^G)
'\b'      -> "\\b", // Backspace (^H)
'\0x000B' -> "\\v", // Vertical tab (^K)
'\0x001B' -> "\\e", // Escape (^[)

答案 3 :(得分:-3)

您还可以将变量*print-base*设置为16.您可以全局:

(setf *print-base* 16) (print '(10 20 30 40)) => (A 14 1E 28) 

或本地:

 (let ((*print-base* 16)) (dolist (c '(10 20 30 40)) (print c)))
=>A 
14 
1E 
28 
NIL