如何使用elisp将十六进制字符串转换为ASCII?

sts*_*uad 4 emacs elisp

今天我收到了一封以十六进制字节为单位的电子邮件的回复:

"686170707920333974682068617665206120676f6f64206f6e6521"
Run Code Online (Sandbox Code Playgroud)

我正在考虑将字符串转换为ASCII等效的最有效的干净方法.我会在问题中添加我的答案,但我觉得它并不像它本来那样优雅.

Ina*_*thi 8

这是一个迭代解决方案

(defun decode-hex-string (hex-string)
  (let ((res nil))
    (dotimes (i (/ (length hex-string) 2) (apply #'concat (reverse res)))
      (let ((hex-byte (substring hex-string (* 2 i) (* 2 (+ i 1)))))
        (push (format "%c" (string-to-number hex-byte 16)) res)))))
Run Code Online (Sandbox Code Playgroud)

并使用一个loop,如果你正在寻找避免副作用操作(您可能需要(require 'cl)为使用这一个):

(defun decode-hex-string (hex-string)
  (apply #'concat 
     (loop for i from 0 to (- (/ (length hex-string) 2) 1) 
           for hex-byte = (substring hex-string (* 2 i) (* 2 (+ i 1)))
           collect (format "%c" (string-to-number hex-byte 16)))))
Run Code Online (Sandbox Code Playgroud)

一般来说,最好避免在Elisp和Common Lisp中递归; 你的堆栈将通过足够大的输入来完成,并且两种语言都不能保证尾递归(你没有使用,但仍然如此).在Scheme中,这是一个不同的故事.

顺便说一句,快乐39号.