You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:23:33