1 | <?php |
||
4 | class Encoder implements EncoderInterface |
||
5 | { |
||
6 | /** |
||
7 | * @param array $hash |
||
8 | * @param int $sequence |
||
9 | * @return string |
||
10 | */ |
||
11 | 1 | public function toCompressedFrame($hash, $sequence) |
|
17 | |||
18 | /** |
||
19 | * @param array $hash |
||
20 | * @param int $sequence |
||
21 | * @return string |
||
22 | */ |
||
23 | 1 | public function toFrame($hash, $sequence) |
|
24 | { |
||
25 | 1 | $frame = array("1", "D", $sequence); |
|
26 | 1 | $pack = "AAN"; |
|
27 | 1 | $keys = $this->deepKeys($hash); |
|
28 | 1 | array_push($frame, count($keys)); |
|
29 | 1 | $pack .= "N"; |
|
30 | 1 | foreach ($keys as $k) { |
|
31 | 1 | $val = $this->deepGet($hash, $k); |
|
32 | 1 | $keyLength = strlen($k); |
|
33 | 1 | $valLength = strlen($val); |
|
34 | 1 | array_push($frame, $keyLength); |
|
35 | 1 | $pack .= "N"; |
|
36 | 1 | array_push($frame, $k); |
|
37 | 1 | $pack .= "A{$keyLength}"; |
|
38 | 1 | array_push($frame, $valLength); |
|
39 | 1 | $pack .= "N"; |
|
40 | 1 | array_push($frame, $val); |
|
41 | 1 | $pack .= "A{$valLength}"; |
|
42 | } |
||
43 | 1 | array_unshift($frame, $pack); |
|
44 | 1 | return call_user_func_array('pack', $frame); |
|
45 | } |
||
46 | |||
47 | /** |
||
48 | * @param array $hash |
||
49 | * @param string $key |
||
50 | * @return null|string |
||
51 | */ |
||
52 | 1 | private function deepGet($hash, $key) |
|
74 | |||
75 | /** |
||
76 | * @param mixed $value |
||
77 | * @return string |
||
78 | */ |
||
79 | 7 | private function stringifyValue($value) |
|
91 | |||
92 | /** |
||
93 | * @param array $hash |
||
94 | * @param string $prefix |
||
95 | * @return array |
||
96 | */ |
||
97 | 1 | private function deepKeys($hash, $prefix = "") |
|
111 | } |
||
112 |