给定一个十进制数列表,如何将每个数字转换为等效的十六进制值,反之亦然?
例如:
(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)
答案 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