2016-06-05 6 views
5

Sto tentando di analizzare le intestazioni LIFX come da their documentation.L'analisi delle intestazioni LIFX restituisce il numero di protocollo errato

Ecco il codice che ho:

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 

Questo mi dice che è 1027, ma la documentazione di LIFX dice che dovrebbe essere 1024. Ho confermato utilizzando LIFX's RubyGem che il valore di questo campo è 1024.

Perché in elisir sto vedendo questo valore di 1027, anziché 1024?

risposta

3

Non sono esperto in questo, ma ho una teoria che l'endianess non funziona come ci si aspetterebbe quando si prendono 12 bit anziché 16. Questa soluzione è solo io che gioco con i numeri come trovato un problema interessante Potrebbe esserci una soluzione migliore, non ho ancora esaminato troppo profondamente l'implementazione di Erlang.

Se ignoriamo tutti gli altri dati, quindi abbiamo questo:

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 

Poiché questo è little-endian, se ci scambiamo i due byte rotonda, otteniamo:

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 

Così un soluzione è:

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

L'ordine dei valori 'p1',' p2' e 'p3' è diverso da quello che ottengo. Ottengo 'p3 = 4' e' p1 = 0'. –

+0

Ma sì, questa soluzione funziona, quindi la contrassegnerò come accettata e passerò :) Grazie! –

+0

Sei corretto, p3 è in realtà 4. Ho aggiornato la risposta. – Gazler