Perl的unpack函数在Clojure中是否有等价实现?
Clojure中类似Perl unpack的等价功能
Clojure没有内置的、和Perl unpack 完全等价的函数,但可以通过字符串/字节序列的基础操作,实现相同的固定长度字段拆分效果。
对应Perl示例的字符串处理实现
Perl的示例代码是从字符串中提取前5字节、跳过3字节、再提取两个8字节字段,最后取剩余部分:
# 获取5字节字符串,跳过3字节,然后获取2个8字节字符串,剩余部分 my ($leading, $s1, $s2, $trailing) = unpack("A5 x3 A8 A8 A*", $data);
在Clojure中,可以用subs函数(处理字符串)结合索引计算来实现:
(defn unpack-str [data] (let [leading (subs data 0 5) skip-offset (+ 5 3) s1-end (+ skip-offset 8) s2-end (+ s1-end 8)] [leading (subs data skip-offset s1-end) (subs data s1-end s2-end) (subs data s2-end)]))
二进制字节数据的处理
如果是处理二进制字节数组,可利用Clojure的序列操作函数take、drop来实现类似逻辑:
(defn unpack-bytes [byte-arr] (let [leading (take 5 byte-arr) after-skip (drop (+ 5 3) byte-arr) s1 (take 8 after-skip) after-s1 (drop 8 after-skip) s2 (take 8 after-s1) trailing (drop 8 after-s1)] [leading s1 s2 trailing]))
自定义格式解析(进阶)
如果需要像Perl那样通过格式字符串(如"A5 x3 A8 A8 A*")动态解析,可以自己封装一个解析函数:拆分格式指令,根据每个指令的类型(取长度、跳过)依次处理输入数据,实现更通用的unpack效果。
内容的提问来源于stack exchange,提问作者earl_igginotnum
相关产品推荐
相关产品推荐

