2016-06-05 21 views
5

देता है मैं their documentation के अनुसार LIFX शीर्षकों को पार्स करने का प्रयास कर रहा हूं।पार्सिंग LIFX शीर्षलेख गलत प्रोटोकॉल नंबर

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 

यह मुझसे कहता है कि 1027 है, लेकिन LIFX के दस्तावेज़ कहते हैं कि यह 1024 होना चाहिए मैं LIFX's RubyGem का उपयोग करके पुष्टि की है कि इस फ़ील्ड का मान 1024

है:

यहाँ कोड मैं है

क्यों एलिक्सिर में मैं 1024 के बजाए 1027 के इस मूल्य को देख रहा हूं?

उत्तर

3

मैं इस पर कोई विशेषज्ञ नहीं हूं, लेकिन मेरे पास एक सिद्धांत है कि अंतहीनता उस तरीके से काम नहीं कर रही है जब आप 16 की बजाय 12 बिट्स लेते हैं। यह समाधान सिर्फ मुझे संख्याओं के साथ खेल रहा है क्योंकि मैं यह एक दिलचस्प समस्या मिली। एक बेहतर समाधान हो सकता है, मैंने अभी तक एर्लंग कार्यान्वयन में बहुत गहराई से नहीं देखा है।

हम अन्य सभी डेटा की अनदेखी करते हैं, तो हम इस राशि:

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 

के बाद से इस छोटे-endian है, अगर हम दो बाइट्स दौर स्वैप, हम पाते हैं:

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 

तो एक समाधान है:

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

'पी 1',' पी 2' और 'पी 3' मानों का क्रम मुझे जो मिलता है उससे अलग है। मुझे 'पी 3 = 4' और 'पी 1 = 0' मिलता है। –

+0

लेकिन हाँ, यह समाधान काम करता है इसलिए मैं इसे स्वीकृत के रूप में चिह्नित करने जा रहा हूं और आगे बढ़ रहा हूं :) धन्यवाद! –

+0

आप सही हैं, पी 3 वास्तव में है 4. मैंने जवाब अपडेट किया है। – Gazler

संबंधित मुद्दे