2016-06-05 18 views
5

Próbuję przeanalizować nagłówki LIFX zgodnie z their documentation.Parsujące nagłówki LIFX zwracają nieprawidłowy numer protokołu

Oto kod mam:

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 

Ten mówi mi, że jest 1027, ale dokumentacja LIFX mówi powinno być 1024. Mam potwierdzone za pomocą LIFX's RubyGem że wartość tej dziedzinie jest 1024.

Dlaczego w Eliksrze widzę tę wartość 1027 zamiast 1024?

Odpowiedz

3

Nie jestem ekspertem w tej dziedzinie, ale mam teorię, że endianess nie działa tak, jak można by się spodziewać, gdy bierze się 12 bitów zamiast 16. To rozwiązanie jest po prostu ja bawię się z liczbami jak ja uznał to za interesujący problem. Może być lepsze rozwiązanie, jeszcze nie zagłębiłem się w implementację erlanga.

Jeśli będziemy ignorować wszystkie inne dane, to mamy to:

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 

Ponieważ jest to little-endian, jeśli zamienić dwa bajty okrągły, otrzymujemy:

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 

więc jeden rozwiązanie to:

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 
+0

Kolejność wartości 'p1',' p2' i 'p3' różni się od wartości, którą otrzymuję. Otrzymuję 'p3 = 4' i' p1 = 0'. –

+0

Ale tak, to rozwiązanie działa, więc zamierzam oznaczyć je jako zaakceptowane i przejść dalej. Dzięki! –

+0

Masz rację, p3 w rzeczywistości 4. Zaktualizowałem odpowiedź. – Gazler