lud
Binary to integer (no parsing)
Hi,
Is there a function that would convert <<1>> to 1, <<1, 0>> to 256. I do not mean parsing the binary as a string representation of the integer.
I want to know how bing a 20 bytes integer can be.
b = 1..20 |> Enum.map(fn _ -> 255 end) |> :erlang.list_to_binary
<<255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255>>
Thank you.
Marked As Solved
voltone
Try :binary.decode_unsigned/1,2, it does exactly what your code does…
Also Liked
LostKobrakai
iex(2)> <<int::integer-size(2)-unit(8)>> = <<255, 255>>
<<255, 255>>
iex(3)> int
65535
NobbZ
There are 2^n possible values in n bits.
ityonemo
If you’re just doing one number, you can use pattern matching likr this:
<<number::16>> = <<1, 0>>
And that will give you 256. This strategy will work for a 20 byte integer (obviously not with 16). Though if you’re using it as a literal I recommend number=0xFFFFFFFF....FFFFF
dimitarvp
Your local thread necromancer checking in.
I am gonna work in my free time on a fairly basic network protocol in Rust, Golang and Elixir, and I am starting with Elixir.
I need to be able to encode and decode unsigned 32-bit integers to/from byte buffers (big endian). While :binary.encode_unsigned(x, :big) works the protocol requires all 4 bytes be sent, and this function always finds the smallest possible representation:
iex(1)> :binary.encode_unsigned 0xFF, :big
<<255>>
Whereas I need <<0, 0, 0, 255>>.
So just to bring visibility in case someone ever needs, encoding is as simple as:
iex(1)> <<255::unsigned-big-integer-32>>
<<0, 0, 0, 255>>
And decoding is done like so:
iex(1)> :binary.decode_unsigned(<<0, 0, 0, 255>>, :big)
255
LostKobrakai
I’d suggest the inverse from encoding, to keep things mirrored/simple:
iex(1)> <<int::unsigned-big-integer-32>> = <<0, 0, 0, 255>>
<<0, 0, 0, 255>>
iex(2)> int
255







