1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.core5.http2.hpack;
29
30 import java.nio.ByteBuffer;
31
32 import org.apache.hc.core5.util.ByteArrayBuffer;
33
34
35
36
37
38 final class HuffmanEncoder {
39
40 private final int[] codes;
41 private final byte[] lengths;
42
43 HuffmanEncoder(final int[] codes, final byte[] lengths) {
44 this.codes = codes;
45 this.lengths = lengths;
46 }
47
48 void encode(final ByteArrayBuffer out, final ByteBuffer src) {
49
50 long current = 0;
51 int n = 0;
52
53 while (src.hasRemaining()) {
54 final int b = src.get() & 0xFF;
55 final int code = codes[b];
56 final int nbits = lengths[b];
57
58 current <<= nbits;
59 current |= code;
60 n += nbits;
61
62 while (n >= 8) {
63 n -= 8;
64 out.append((int)(current >> n));
65 }
66 }
67
68 if (n > 0) {
69 current <<= (8 - n);
70 current |= (0xFF >>> n);
71 out.append((int) current);
72 }
73 }
74
75 void encode(final ByteArrayBuffer out, final CharSequence src, final int off, final int len) {
76
77 long current = 0;
78 int n = 0;
79
80 for (int i = 0; i < len; i++) {
81 final int b = src.charAt(off + i) & 0xFF;
82 final int code = codes[b];
83 final int nbits = lengths[b];
84
85 current <<= nbits;
86 current |= code;
87 n += nbits;
88
89 while (n >= 8) {
90 n -= 8;
91 out.append((int)(current >> n));
92 }
93 }
94
95 if (n > 0) {
96 current <<= (8 - n);
97 current |= (0xFF >>> n);
98 out.append((int) current);
99 }
100 }
101
102 }