将输出整数格式化为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)
Run Code Online (Sandbox Code Playgroud)
输入0x75756964和输出是uuid
您可以编写一个适用于大于或小于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)
Run Code Online (Sandbox Code Playgroud)
然后,您将转换为字符串,如下所示:
(map 'string #'code-char (bytes-from-integer #x75756964))
=> "uuid"
Run Code Online (Sandbox Code Playgroud)
注意:CHECK-TYPE是一个宏,用于检查某个位置是否满足给定的类型表达式.上面,地方是integer变量,类型是(integer 0),相当于(integer 0 *),也被称为unsigned-byte.