@@ -6,5 +6,54 @@ class BinaryDumper
66{
77 public function toBinary (Message $ message )
88 {
9+ $ data = '' ;
10+
11+ $ data .= $ this ->headerToBinary ($ message ->header );
12+ $ data .= $ this ->questionToBinary ($ message ->question );
13+
14+ return $ data ;
15+ }
16+
17+ private function headerToBinary (array $ header )
18+ {
19+ $ data = '' ;
20+
21+ $ data .= pack ('n ' , $ header ['id ' ]);
22+
23+ $ flags = 0x00 ;
24+ $ flags = ($ flags << 1 ) | $ header ['qr ' ];
25+ $ flags = ($ flags << 4 ) | $ header ['opcode ' ];
26+ $ flags = ($ flags << 1 ) | $ header ['aa ' ];
27+ $ flags = ($ flags << 1 ) | $ header ['tc ' ];
28+ $ flags = ($ flags << 1 ) | $ header ['rd ' ];
29+ $ flags = ($ flags << 1 ) | $ header ['ra ' ];
30+ $ flags = ($ flags << 3 ) | $ header ['z ' ];
31+ $ flags = ($ flags << 4 ) | $ header ['rcode ' ];
32+
33+ $ data .= pack ('n ' , $ flags );
34+
35+ $ data .= pack ('n ' , $ header ['qdCount ' ]);
36+ $ data .= pack ('n ' , $ header ['anCount ' ]);
37+ $ data .= pack ('n ' , $ header ['nsCount ' ]);
38+ $ data .= pack ('n ' , $ header ['arCount ' ]);
39+
40+ return $ data ;
41+ }
42+
43+ private function questionToBinary (array $ question )
44+ {
45+ $ data = '' ;
46+
47+ foreach ($ question as $ q ) {
48+ $ labels = explode ('. ' , $ q ['name ' ]);
49+ foreach ($ labels as $ label ) {
50+ $ data .= chr (strlen ($ label )).$ label ;
51+ }
52+ $ data .= "\x00" ;
53+
54+ $ data .= pack ('n* ' , $ q ['type ' ], $ q ['class ' ]);
55+ }
56+
57+ return $ data ;
958 }
1059}
0 commit comments