2017-04-27 4 views
-2

mag ich die IP-Adresse, die Portnummer und benutzerdefinierte Inhalte in den binären, tue binäre Anpassung für ganze Zahlen setzen, aber ich kann nicht einen Weg, es zu tun finden.Wie parsen Tupel, Integer und String in Erlang-Binärdatei?

Angenommen, die IP-Adresse ist IP = {192,168,1,1}, die Portnummer ist PN = 10000 und benutzerdefinierte Inhalte ist Content = <<"{request, {M, F, A}}">>, kann ich sie alle in binäre setzen durch Bin = <<list_to_binary(tuple_to_list(IP))/binary, Content/binary, PN/integer>> verwenden, das binäre Ergebnis ist

<<127,0,0,1,123,114,101,113,117,101,115,116,44,32,123,77, 
    44,32,70,44,32,65,125,125,16>> 

Aber wenn ich versuche zu tun Binary Matching für die Port-Nummer (PN), es geht um etwas anderes (16), wie kann ich mit der Ganzzahl umgehen und behalten Sie ihre Größe auf 1 in der Binärdatei?

Die binäre Anpassung ist: <<A:4/binary, B:20/binary, C>> = Bin. Das Ergebnis von C 16 ist, nicht 10000.

Ein weiteres Problem, das ich fragen möchte, ist, wie die Größe des Pakets zu begrenzen? Ist es möglich, die Paketgröße zu begrenzen, ohne die Länge des Inhalts zu berücksichtigen? Kompromisse oder hacken Sie es in mehrere Teile?

+0

Ich sehe verschiedene Dinge here.The Code geschrieben nicht mit dem binären erzeugt entsprechen. Wie auch immer, woher weißt du, dass "Content" 20 Bytes ist? Unter anderem glaube ich, dass du genau das findest. –

+0

@AsierAzkuenaga Danke, ich habe das Problem bemerkt und bearbeite den Inhalt erneut. Ich weiß, dass der Inhalt 20 Byte ist, indem Byte_size (Inhalt) verwendet. – billcyz

+0

Ich möchte für die Ganzzahl (Portnummer) übereinstimmen, aber das Ergebnis ist anders. – billcyz

Antwort

1

Sie werden mindestens 14 Bits benötigen die Nummer 10000. Ein Weg, um dies darzustellen wäre, zu tun:

Bin = << IPBin/binary, Content/binary, PN:14/integer-unit:1>>. 

, die in der binären führen:

<<192,168,1,1,123,114,101,113,117,101,115,116,44,32,123, 
77,44,32,70,44,32,65,125,125,156,16:6>> 

Es kann dann wie folgt angepasst werden:

<<A:4/binary, B:20/binary, C:14/integer-unit:1>> = Bin. 

Hoffe, das wirft ein wenig Licht auf Segments for bit syntax

Hinweis: Sie benötigen 2 Bytes, die eine beliebige Portnummer darstellen, so PN:16/integer oder PN:16/unsigned wird besser sein.

1

Wenn die Portnummer der letzte Teil der Binärdatei und die Größe von allem anderen ist, können Sie integer_to_binary(PN) verwenden und diesen Wert an die Binärdatei anhängen.

Sie würden dann binary_to_integer(C) für die Rückwärts verwenden, wird diejenige C durch Mustererkennung extrahiert.

1
3> IP = {192,168,1,1}, PN = 10000, Content = <<"{request, {M, F, A}}">>. 
<<"{request, {M, F, A}}">> 
4> Encode = fun({A, B, C, D}, PN, Content) -> <<A, B, C, D, PN:16/unsigned, Content/bytes>> end. 
#Fun<erl_eval.18.50752066> 
5> Decode = fun(<<A, B, C, D, PN:16/unsigned, Content/bytes>>) -> {{A, B, C, D}, PN, Content} end. 
#Fun<erl_eval.6.50752066> 
6> V = Encode(IP, PN, Content). 
<<192,168,1,1,39,16,123,114,101,113,117,101,115,116,44,32, 
    123,77,44,32,70,44,32,65,125,125>> 
7> Decode(V). 
{{192,168,1,1},10000,<<"{request, {M, F, A}}">>}