Ruby中Array.pack的Elixir等效实现及数组打包方法咨询
在Elixir中实现类似Ruby的数组打包/解包功能
当然有啦!在Elixir里,你可以借助内置的:binary模块来实现和Ruby中pack/unpack完全对应的二进制数据处理功能——这可是Elixir处理字节级数据的核心工具。
咱们直接对应你给出的Ruby示例来写代码,一看就懂:
1. 打包数组(对应Ruby的pack("L*"))
Ruby里的"L*"表示把列表里的所有元素按小端字节序的32位无符号整数格式打包成字节序列。在Elixir里,我们可以遍历每个整数,用:binary.encode_unsigned/2处理后拼接起来:
# 对应Ruby的 [3340546, 3340547].pack("L*") numbers = [3340546, 3340547] packed_binary = Enum.map(numbers, fn num -> :binary.encode_unsigned(num, :little) end) |> :binary.list_to_bin() # 结果:<<2, 249, 50, 0, 3, 249, 50, 0>> # 和Ruby输出的"\x02\xF92\x00\x03\xF92\x00"完全一致(50是字符'2'的ASCII码)
2. 解包二进制(对应Ruby的unpack("L*"))
反过来,要把字节序列还原成整数列表,我们可以把二进制按4字节(32位)拆分,再用:binary.decode_unsigned/2解析每个片段:
# 对应Ruby的 "\x02\xF92\x00\x03\xF92\x00".unpack("L*") packed = <<2, 249, 50, 0, 3, 249, 50, 0>> unpacked_numbers = packed |> :binary.bin_to_list() |> Enum.chunk_every(4) |> Enum.map(fn chunk -> :binary.decode_unsigned(:binary.list_to_bin(chunk), :little) end) # 结果:[3340546, 3340547]
额外说明
- 如果需要大端字节序,只需要把
:little换成:big就行,对应Ruby里的"N*"格式。 - 对于更复杂的二进制格式(比如混合不同类型的数据),你还可以结合Elixir的二进制模式匹配来处理,灵活性非常高。
内容的提问来源于stack exchange,提问作者Marsel.V
相关产品推荐
相关产品推荐

