我有一个形式的位串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)
我有一个形式的位串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)
如果目标是编码然后解码位串,并且存储效率是一个问题,我会使用将位串转换为二进制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 编码器,并A.decode
在使用 JSON 解码器解码后调用。
无法将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"