我有一个字节列表,我想将其作为字符串读取。我试过,例如,
(sb-ext:octets-to-string (list 30 40 50))
或
(babel:octets-to-string (list 30 40 50))
但两者都抱怨输入不是“(VECTOR (UNSIGNED-BYTE 8))”。所以我了解到我可以通过
将我的列表转换为向量(coerce (list 30 40 50) 'vector)
但这仍然不够,因为
coerce
返回一个“简单向量”并且元素仍然是整数,而不是“(无符号字节8)”。
我看了类似的问题,但没有一个处理输入是整数列表。请注意,我知道没有大于 255 的整数,因此溢出不是问题。
您需要创建具有元素类型
(unsigned-byte 8)
的矢量。例如,可以通过 MAKE-ARRAY
和 COERCE
创建向量。
MAKE-ARRAY
需要正确的元素类型:
(sb-ext:octets-to-string
(make-array 3
:initial-contents '(30 40 50)
:element-type '(unsigned-byte 8)))
COERCE
需要强制转换为正确的类型。类型描述VECTOR
取一个元素type作为第二个元素:
(sb-ext:octets-to-string
(coerce '(30 40 50)
'(vector (unsigned-byte 8))))
(map ‘string ‘code-char list)
是一种粗略的方法,只要您的整数直接对应于 code-char 假定的编码。如果不考虑编码以及实现支持和默认的内容,就无法稳健地做到这一点。