相当于Elixir中Ruby的Array.pack

问题描述 投票:2回答:1

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上为数组制作包?

elixir
1个回答
4
投票

是!在Elixir中,我们使用二进制模式匹配来实现这一目标。 Ruby的pack / unpack中的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]
© www.soinside.com 2019 - 2024. All rights reserved.