我有一个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)
答案 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"