从凤凰视图渲染位串

时间:2018-08-03 10:31:46

标签: elixir rendering phoenix-framework bit bitstring

我有一个bitstring = <<18::6,8::4,2::5,16::5,18::6,3000::16,0::4>>形式的位串。我想渲染,但是毒药或杰森似乎没有渲染。呈现这种响应的最佳方式是什么?

类似这样的东西

bits = <<18::6,8::4,2::5,16::5,18::6,3000::16,0::4>>
render(conn, "bits.json", bits: bits)

2 个答案:

答案 0 :(得分:2)

如果目标是先编码然后再解码位串,并且存储效率是一个问题,那么我将使用term_to_binary将位串转换为二进制,然后将其编码为base-64串。这将为您提供一个很好的紧凑的位串表示形式,以后可以对其进行解码。

defmodule A do
  def encode(bitstring) when is_bitstring(bitstring) do
    bitstring |> :erlang.term_to_binary() |> Base.encode64
  end

  def decode(binary) do
    decoded = binary |> Base.decode64!() |> :erlang.binary_to_term([:safe])
    if is_bitstring(decoded), do: decoded, else: nil
  end
end

IO.inspect encoded = A.encode(<<0::220>>)
IO.inspect A.decode(encoded)

输出:

"g00AAAAcBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
<<0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0::size(4)>>

您可以将A.encode的输出传递到JSON编码器,并在使用JSON解码器解码后调用A.decode

答案 1 :(得分:1)

一个人不能将46位转换为字节数组。 AFAICT,这里有两个最自然的选择。

可能将数组与值的二进制表示形式一起使用:

for << <<c::1>> <- <<18::6,8::4,2::5,16::5,18::6,3000::16,0::4>> >>, do: c    
#⇒ [0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
#   0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]

或者一个人可以使用上面连接的二进制文件:

(for << <<c::1>> <- <<18::6,8::4,2::5,16::5,18::6,3000::16,0::4>> >>, do: c)
|> Enum.join()
#⇒ "0100101000000101000001001000001011101110000000"