【问题标题】:Convert decimal <-> hex转换十进制<->十六进制
【发布时间】:2010-03-01 19:51:48
【问题描述】:

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

例如:

(转换 2 十六进制 255 64 64); -> (FF 40 40) (转换 2dec FF 40 40); -> (255 64 64) (转换 2 十六进制 255 64 64 255 64 64 128) (转换 2dec FF 40 40 FF 40 40 80)

【问题讨论】:

  • 这是作业吗?我首先要做的是在高层次上理解将基数 10 转换为基数 16 的算法,尝试在 lisp 中实现它之前。
  • 不是作业。 Emacs Lisp 可能不在任何学校的关注范围内? :-) 我想实际的转换能力可能在 Emacs 的某个地方。如果我只想转换一个数字,我可以使用 Calc,例如。
  • 我在学校的时候写过 lisp。调用 Calc 似乎有点矫枉过正,基本转换算法还不错。

标签: elisp


【解决方案1】:

数字转十六进制:

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

您还可以使用以下方法对值进行零填充:

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

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

十六进制字符串转数字

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

16 的意思是“读取为 base-16”。

【讨论】:

  • 参数16 被称为基数。
【解决方案2】:

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

#xFF
==> 255

您还可以将#b 用于二进制,#o 用于八进制数,或#36r 用于基数 36:

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

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

【讨论】:

    【解决方案3】:

    我对在源文件中将八进制字符转换为十六进制字符感兴趣。

    我想对以下文本进行查询搜索和替换:

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

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

    C-M-%

    '\\\([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 (^[)
    

    【讨论】: