I am trying to parse the LIFX headers as per their documentation.
Here is the code I have:
data = <<36, 0, 0, 52, 33, 235, 176, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0>>
<< size :: little-integer-size(16),
origin :: little-integer-size(2),
tagged :: size(1),
addressable :: size(1),
protocol :: little-integer-size(12),
rest :: bitstring >> = data
IO.puts protocol
This tells me that protocol
is 1027
, but LIFX's documentation says it should be 1024. I've confirmed by using LIFX's RubyGem that this field's value is 1024.
Why in Elixir am I seeing this value of 1027, rather than 1024?
I'm no expert at this, but I have a theory that the endianess isn't working the way you would expect when you take 12 bits instead of 16. This solution is just me playing around with the numbers as I found it an interesting problem. There may be a better solution, I haven't looked too deeply in to the erlang implementation yet.
If we ignore all other data, then we have this:
data = <<0, 52>>
# data is equal to 0000 0000 0011 0100
# oota pppp pppp pppp
<< origin :: little-integer-size(2),
tagged :: size(1),
addressable :: size(1),
protocol :: little-integer-size(12) >> = data
IO.puts protocol # 1027
IO.puts origin # 0
IO.puts tagged # 0
IO.puts addressable # 0
# doing little-endiain on 12 bits = 0100 0000 0011
# pppp pppp pppp
Since this is little-endian, if we swap the two bytes round, we get:
data = <<52, 0>>
# data is equal to 0011 0100 0000 0000
# oota pppp pppp pppp
<< origin :: integer-size(2),
tagged :: size(1),
addressable :: size(1),
protocol :: integer-size(12) >> = data
IO.puts protocol # 1024
IO.puts origin # 0
IO.puts tagged # 1
IO.puts addressable # 1
So one solution is:
data = <<0, 52>>
<< p1 :: integer-size(4),
p2 :: integer-size(4),
<< origin :: size(2), tagged :: size(1), addressable :: size(1) >>,
p3 :: integer-size(4) >> = data
IO.inspect p1 # 0
IO.inspect p2 # 0
IO.inspect p3 # 4
<< protocol :: size(12) >> = <<p3 :: size(4), p2 :: size(4), p1 :: size(4)>>
IO.puts protocol # 1024
IO.puts origin # 0
IO.puts tagged # 1
IO.puts addressable # 1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With