如何将整数字节列表转换为字符串?

问题描述 投票:0回答:2

我有一个字节列表,我想将其作为字符串读取。我试过,例如,

(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 的整数,因此溢出不是问题。

vector common-lisp sbcl type-declaration
2个回答
1
投票

您需要创建具有元素类型

(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))))

0
投票

(map ‘string ‘code-char list)
是一种粗略的方法,只要您的整数直接对应于 code-char 假定的编码。如果不考虑编码以及实现支持和默认的内容,就无法稳健地做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.