296 lines
11 KiB
PHP
296 lines
11 KiB
PHP
<?php
|
|
|
|
namespace NoccyLabs\React\Http2\Huffman;
|
|
|
|
class Dictionary
|
|
{
|
|
private array $codes;
|
|
|
|
private array $patterns;
|
|
|
|
public function __construct(?array $codes = [])
|
|
{
|
|
$this->codes = $codes;
|
|
$this->patterns = array_flip($codes);
|
|
}
|
|
|
|
public function match(string &$pattern): ?int
|
|
{
|
|
for ($l = 1; $l <= strlen($pattern); $l++) {
|
|
$t = substr($pattern, 0, $l);
|
|
if (array_key_exists($t, $this->patterns)) {
|
|
$pattern = substr($pattern, strlen($t));
|
|
return $this->patterns[$t];
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public function pattern(int $code): string
|
|
{
|
|
return $this->codes[$code];
|
|
}
|
|
|
|
public static function createRfc7541Dictionary(): Dictionary
|
|
{
|
|
return new Dictionary(array (
|
|
0 => '1111111111000',
|
|
1 => '11111111111111111011000',
|
|
2 => '1111111111111111111111100010',
|
|
3 => '1111111111111111111111100011',
|
|
4 => '1111111111111111111111100100',
|
|
5 => '1111111111111111111111100101',
|
|
6 => '1111111111111111111111100110',
|
|
7 => '1111111111111111111111100111',
|
|
8 => '1111111111111111111111101000',
|
|
9 => '111111111111111111101010',
|
|
10 => '111111111111111111111111111100',
|
|
11 => '1111111111111111111111101001',
|
|
12 => '1111111111111111111111101010',
|
|
13 => '111111111111111111111111111101',
|
|
14 => '1111111111111111111111101011',
|
|
15 => '1111111111111111111111101100',
|
|
16 => '1111111111111111111111101101',
|
|
17 => '1111111111111111111111101110',
|
|
18 => '1111111111111111111111101111',
|
|
19 => '1111111111111111111111110000',
|
|
20 => '1111111111111111111111110001',
|
|
21 => '1111111111111111111111110010',
|
|
22 => '111111111111111111111111111110',
|
|
23 => '1111111111111111111111110011',
|
|
24 => '1111111111111111111111110100',
|
|
25 => '1111111111111111111111110101',
|
|
26 => '1111111111111111111111110110',
|
|
27 => '1111111111111111111111110111',
|
|
28 => '1111111111111111111111111000',
|
|
29 => '1111111111111111111111111001',
|
|
30 => '1111111111111111111111111010',
|
|
31 => '1111111111111111111111111011',
|
|
32 => '010100',
|
|
33 => '1111111000',
|
|
34 => '1111111001',
|
|
35 => '111111111010',
|
|
36 => '1111111111001',
|
|
37 => '010101',
|
|
38 => '11111000',
|
|
39 => '11111111010',
|
|
40 => '1111111010',
|
|
41 => '1111111011',
|
|
42 => '11111001',
|
|
43 => '11111111011',
|
|
44 => '11111010',
|
|
45 => '010110',
|
|
46 => '010111',
|
|
47 => '011000',
|
|
48 => '00000',
|
|
49 => '00001',
|
|
50 => '00010',
|
|
51 => '011001',
|
|
52 => '011010',
|
|
53 => '011011',
|
|
54 => '011100',
|
|
55 => '011101',
|
|
56 => '011110',
|
|
57 => '011111',
|
|
58 => '1011100',
|
|
59 => '11111011',
|
|
60 => '111111111111100',
|
|
61 => '100000',
|
|
62 => '111111111011',
|
|
63 => '1111111100',
|
|
64 => '1111111111010',
|
|
65 => '100001',
|
|
66 => '1011101',
|
|
67 => '1011110',
|
|
68 => '1011111',
|
|
69 => '1100000',
|
|
70 => '1100001',
|
|
71 => '1100010',
|
|
72 => '1100011',
|
|
73 => '1100100',
|
|
74 => '1100101',
|
|
75 => '1100110',
|
|
76 => '1100111',
|
|
77 => '1101000',
|
|
78 => '1101001',
|
|
79 => '1101010',
|
|
80 => '1101011',
|
|
81 => '1101100',
|
|
82 => '1101101',
|
|
83 => '1101110',
|
|
84 => '1101111',
|
|
85 => '1110000',
|
|
86 => '1110001',
|
|
87 => '1110010',
|
|
88 => '11111100',
|
|
89 => '1110011',
|
|
90 => '11111101',
|
|
91 => '1111111111011',
|
|
92 => '1111111111111110000',
|
|
93 => '1111111111100',
|
|
94 => '11111111111100',
|
|
95 => '100010',
|
|
96 => '111111111111101',
|
|
97 => '00011',
|
|
98 => '100011',
|
|
99 => '00100',
|
|
100 => '100100',
|
|
101 => '00101',
|
|
102 => '100101',
|
|
103 => '100110',
|
|
104 => '100111',
|
|
105 => '00110',
|
|
106 => '1110100',
|
|
107 => '1110101',
|
|
108 => '101000',
|
|
109 => '101001',
|
|
110 => '101010',
|
|
111 => '00111',
|
|
112 => '101011',
|
|
113 => '1110110',
|
|
114 => '101100',
|
|
115 => '01000',
|
|
116 => '01001',
|
|
117 => '101101',
|
|
118 => '1110111',
|
|
119 => '1111000',
|
|
120 => '1111001',
|
|
121 => '1111010',
|
|
122 => '1111011',
|
|
123 => '111111111111110',
|
|
124 => '11111111100',
|
|
125 => '11111111111101',
|
|
126 => '1111111111101',
|
|
127 => '1111111111111111111111111100',
|
|
128 => '11111111111111100110',
|
|
129 => '1111111111111111010010',
|
|
130 => '11111111111111100111',
|
|
131 => '11111111111111101000',
|
|
132 => '1111111111111111010011',
|
|
133 => '1111111111111111010100',
|
|
134 => '1111111111111111010101',
|
|
135 => '11111111111111111011001',
|
|
136 => '1111111111111111010110',
|
|
137 => '11111111111111111011010',
|
|
138 => '11111111111111111011011',
|
|
139 => '11111111111111111011100',
|
|
140 => '11111111111111111011101',
|
|
141 => '11111111111111111011110',
|
|
142 => '111111111111111111101011',
|
|
143 => '11111111111111111011111',
|
|
144 => '111111111111111111101100',
|
|
145 => '111111111111111111101101',
|
|
146 => '1111111111111111010111',
|
|
147 => '11111111111111111100000',
|
|
148 => '111111111111111111101110',
|
|
149 => '11111111111111111100001',
|
|
150 => '11111111111111111100010',
|
|
151 => '11111111111111111100011',
|
|
152 => '11111111111111111100100',
|
|
153 => '111111111111111011100',
|
|
154 => '1111111111111111011000',
|
|
155 => '11111111111111111100101',
|
|
156 => '1111111111111111011001',
|
|
157 => '11111111111111111100110',
|
|
158 => '11111111111111111100111',
|
|
159 => '111111111111111111101111',
|
|
160 => '1111111111111111011010',
|
|
161 => '111111111111111011101',
|
|
162 => '11111111111111101001',
|
|
163 => '1111111111111111011011',
|
|
164 => '1111111111111111011100',
|
|
165 => '11111111111111111101000',
|
|
166 => '11111111111111111101001',
|
|
167 => '111111111111111011110',
|
|
168 => '11111111111111111101010',
|
|
169 => '1111111111111111011101',
|
|
170 => '1111111111111111011110',
|
|
171 => '111111111111111111110000',
|
|
172 => '111111111111111011111',
|
|
173 => '1111111111111111011111',
|
|
174 => '11111111111111111101011',
|
|
175 => '11111111111111111101100',
|
|
176 => '111111111111111100000',
|
|
177 => '111111111111111100001',
|
|
178 => '1111111111111111100000',
|
|
179 => '111111111111111100010',
|
|
180 => '11111111111111111101101',
|
|
181 => '1111111111111111100001',
|
|
182 => '11111111111111111101110',
|
|
183 => '11111111111111111101111',
|
|
184 => '11111111111111101010',
|
|
185 => '1111111111111111100010',
|
|
186 => '1111111111111111100011',
|
|
187 => '1111111111111111100100',
|
|
188 => '11111111111111111110000',
|
|
189 => '1111111111111111100101',
|
|
190 => '1111111111111111100110',
|
|
191 => '11111111111111111110001',
|
|
192 => '11111111111111111111100000',
|
|
193 => '11111111111111111111100001',
|
|
194 => '11111111111111101011',
|
|
195 => '1111111111111110001',
|
|
196 => '1111111111111111100111',
|
|
197 => '11111111111111111110010',
|
|
198 => '1111111111111111101000',
|
|
199 => '1111111111111111111101100',
|
|
200 => '11111111111111111111100010',
|
|
201 => '11111111111111111111100011',
|
|
202 => '11111111111111111111100100',
|
|
203 => '111111111111111111111011110',
|
|
204 => '111111111111111111111011111',
|
|
205 => '11111111111111111111100101',
|
|
206 => '111111111111111111110001',
|
|
207 => '1111111111111111111101101',
|
|
208 => '1111111111111110010',
|
|
209 => '111111111111111100011',
|
|
210 => '11111111111111111111100110',
|
|
211 => '111111111111111111111100000',
|
|
212 => '111111111111111111111100001',
|
|
213 => '11111111111111111111100111',
|
|
214 => '111111111111111111111100010',
|
|
215 => '111111111111111111110010',
|
|
216 => '111111111111111100100',
|
|
217 => '111111111111111100101',
|
|
218 => '11111111111111111111101000',
|
|
219 => '11111111111111111111101001',
|
|
220 => '1111111111111111111111111101',
|
|
221 => '111111111111111111111100011',
|
|
222 => '111111111111111111111100100',
|
|
223 => '111111111111111111111100101',
|
|
224 => '11111111111111101100',
|
|
225 => '111111111111111111110011',
|
|
226 => '11111111111111101101',
|
|
227 => '111111111111111100110',
|
|
228 => '1111111111111111101001',
|
|
229 => '111111111111111100111',
|
|
230 => '111111111111111101000',
|
|
231 => '11111111111111111110011',
|
|
232 => '1111111111111111101010',
|
|
233 => '1111111111111111101011',
|
|
234 => '1111111111111111111101110',
|
|
235 => '1111111111111111111101111',
|
|
236 => '111111111111111111110100',
|
|
237 => '111111111111111111110101',
|
|
238 => '11111111111111111111101010',
|
|
239 => '11111111111111111110100',
|
|
240 => '11111111111111111111101011',
|
|
241 => '111111111111111111111100110',
|
|
242 => '11111111111111111111101100',
|
|
243 => '11111111111111111111101101',
|
|
244 => '111111111111111111111100111',
|
|
245 => '111111111111111111111101000',
|
|
246 => '111111111111111111111101001',
|
|
247 => '111111111111111111111101010',
|
|
248 => '111111111111111111111101011',
|
|
249 => '1111111111111111111111111110',
|
|
250 => '111111111111111111111101100',
|
|
251 => '111111111111111111111101101',
|
|
252 => '111111111111111111111101110',
|
|
253 => '111111111111111111111101111',
|
|
254 => '111111111111111111111110000',
|
|
255 => '11111111111111111111101110',
|
|
256 => '111111111111111111111111111111',
|
|
));
|
|
}
|
|
} |