在普通Lisp中将整数格式为chars

时间:2018-10-17 18:02:57

标签: common-lisp

格式化输出整数为char序列的最佳方法是什么?我尝试在下面的代码块中运行,但无法确定是否正确:

(defun int2chars(x)
  (format t "~c~c~c~c~%"
      (code-char (ldb (byte 8 24) x))
      (code-char (ldb (byte 8 16) x))
      (code-char (ldb (byte 8 8) x))
      (code-char (ldb (byte 8 0) x))
      ))

(defun test()
  (let ((x #x75756964))
    (int2chars x)))

(test)

输入为0x75756964,输出为uuid

1 个答案:

答案 0 :(得分:6)

您可以编写一个适用于大于或小于32位的整数的函数:

(defun bytes-from-integer (integer)
  (check-type integer (integer 0))
  (loop
    with size = (* 8 (1- (ceiling (integer-length integer) 8)))
    for offset from size downto 0 by 8
    collect (ldb (byte 8 offset) integer)))

(bytes-from-integer #x75756964)
=> (117 117 105 100)

(bytes-from-integer #x7575696475756964)
=> (117 117 105 100 117 117 105 100)

然后,您将转换为字符串,如下所示:

(map 'string #'code-char (bytes-from-integer #x75756964))
=> "uuid"

注意:CHECK-TYPE是一个宏,用于检查 place 是否满足给定的 type 表达式。在上方,位置是integer变量,类型是(integer 0),相当于(integer 0 *),也称为unsigned-byte