2015-05-08 16 views
7

İkili bir dosya okuyorum ve içinde veri ilk baytını izleyen veri türünü gösteren bir yapı var. Bunu desen eşleştirmesiyle çözmeye çalışıyorum ve sorun yaşıyorum.Bir yöntem imzasında bir ikiliin parçası üzerinde eşleştirme

yapmam hiçbiri işe yarayabilir Düşündüm birkaç yolu, denedim. ["11!", "12!", "13!"] yerine: Ben almak istiyorum

defmodule Test do 

    def build(<< 0x11, rest >>) do 
    "11!" 
    end 

    def build(<< 0x12, rest :: size(4) >>) do 
    "12!" 
    end 

    def build(<< type, rest >>) 
    when type == 0x13 do 
    "13!" 
    end 

    def build(bytes) do 
    "Unknown!" 
    end 

end 

[ << 0x11, 0x01, 0x02, 0x03, 0x04 >>, 
    << 0x12, 0x01, 0x02, 0x03, 0x04 >>, 
    << 0x13, 0x01, 0x02, 0x03, 0x04 >> ] 
|> Enum.map(&Test.build/1) 
|> IO.inspect 
# => ["Unknown!", "Unknown!", "Unknown!"] 

: Aşağıda benim zayıf girişimleri görebilirsiniz.

Bunlar ile eşleşen veriler sabit bir boyuttadır (bu durumda 5 toplam bayt). This SO question, toplam boyutu da belirtmem gerektiğini önerdi mi? Bunu nasıl yapacağından emin değilim.

Sonuçta, yöntemler eşleştirme yoluyla gönderilirse ilk baytın değeri umurumda değil, bu nedenle her bir yöntem gövdesinde gerçekten ihtiyaç duyduğum tek şey rest. Neyi kaçırıyorum?

cevap

8

bir ikili düzende her ilişkisiz değişken varsayılan olarak bir bayt eşleşir. Rasgele bir uzunluk dinamiğini eşleştirmek istiyorsanız, binary değiştiricisini kullanmanız gerekir.

defmodule Test do 
    def build(<<0x11, rest :: binary>>) do 
    "11!" 
    end 

    def build(<<0x12, rest :: binary>>) do 
    "12!" 
    end 

    def build(<<0x13, rest :: binary>>) do 
    "13!" 
    end 

    def build(bytes) do 
    "Unknown!" 
    end 
end 
+0

harika çalışıyor, teşekkürler! –

İlgili konular