相当于Elixir中Ruby的Array.pack

时间:2018-01-24 10:29:19

标签: elixir

ruby​​上有一个适用于压缩数组的应用程序:

2.3.1 :001 > [3340546, 3340547].pack("L*")
 => "\x02\xF92\x00\x03\xF92\x00" 
2.3.1 :002 > "\x02\xF92\x00\x03\xF92\x00".unpack("L*")
 => [3340546, 3340547]

是否可以选择在Elixir上为数组制作包?

1 个答案:

答案 0 :(得分:4)

是的!在Elixir中,我们使用二进制模式匹配来实现这一目标。 Ruby中的L打包/解包是针对32位无符号小端整数。以下是您在Elixir中执行这两项操作的方法:

包:

iex(1)> <<3340546::32-little, 3340547::32-little>>
<<2, 249, 50, 0, 3, 249, 50, 0>>

解包:

iex(2)> <<a::32-little, b::32-little>> = "\x02\xF92\x00\x03\xF92\x00"
<<2, 249, 50, 0, 3, 249, 50, 0>>
iex(3)> a
3340546
iex(4)> b
3340547

您还可以打包/解包任意数量的值列表,如下所示:

iex(5)> Enum.map_join([3340546, 3340547], fn x -> <<x::32-little>> end)
<<2, 249, 50, 0, 3, 249, 50, 0>>
iex(6)> for <<x::32-little <- "\x02\xF92\x00\x03\xF92\x00">>, do: x
[3340546, 3340547]