今天我收到了一封以十六进制字节为单位的电子邮件的回复:
"686170707920333974682068617665206120676f6f64206f6e6521"
Run Code Online (Sandbox Code Playgroud)
我正在考虑将字符串转换为ASCII等效的最有效的干净方法.我会在问题中添加我的答案,但我觉得它并不像它本来那样优雅.
这是一个迭代解决方案
(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号.
| 归档时间: |
|
| 查看次数: |
2815 次 |
| 最近记录: |