41.20.2 字节解包与打包函数

在下面的说明中,typebindat-type 返回的 Bindat 类型值,raw 指字节数组,struct 指表示解包后字段数据的关联列表。

Function: bindat-unpack type raw &optional idx

该函数根据 type,从单字节字符串或字节数组 raw 中解包数据。 通常从字节数组开头开始解包,但如果 idxnil,则使用该从零开始的起始位置。

返回值是一个关联列表或嵌套关联列表,其中每个元素描述一个解包后的字段。

Function: bindat-get-field struct &rest name

该函数从嵌套关联列表 struct 中取出某个字段的数据。struct 通常由 bindat-unpack 返回。如果只传入一个 name 参数, 表示提取顶层字段的值。多个 name 参数表示逐级查找子结构。整数类型的 name 会作为数组下标使用。

例如,(bindat-get-field struct a b 2 c) 表示 取出 struct 中 a 字段、b 子字段的第三个元素里的 c 字段。(对应 C 语言语法中的 struct.a.b[2].c)。

尽管打包和解包操作会改变数据在内存中的组织形式,但它们会保留数据的 总长度(total length),即所有字段长度之和(以字节为单位)。该值通常无法仅从规范或关联列表中直接得出,而需要结合两者共同计算。同样,待解包的字符串或数组的长度 也可能大于规范所描述的数据总长度。

Function: bindat-length type struct

该函数根据 type,返回 struct 中数据的总长度。

Function: bindat-pack type struct &optional raw idx

该函数根据 type,将关联列表 struct 中的数据打包成字节数组并返回。 默认会创建一个新的字节数组并从头开始填充。但如果 rawnil,则指定一个预分配的单字节字符串或向量用于存放打包结果。如果 idxnil,则指定 在 raw 中开始打包的偏移量。

使用预分配空间时,应确保 (length raw) 大于等于总长度,以避免越界错误。

Function: bindat-ip-to-string ip

将互联网地址向量 ip 转换为常见的点分格式字符串。

(bindat-ip-to-string [127 0 0 1])
     ⇒ "127.0.0.1"