1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.http2.hpack;
20
21 import java.nio.ByteBuffer;
22
23 public class NBitInteger
24 {
25 public static int octectsNeeded(int n,int i)
26 {
27 if (n==8)
28 {
29 int nbits = 0xFF;
30 i=i-nbits;
31 if (i<0)
32 return 1;
33 if (i==0)
34 return 2;
35 int lz=Integer.numberOfLeadingZeros(i);
36 int log=32-lz;
37 return 1+(log+6)/7;
38 }
39
40 int nbits = 0xFF >>> (8 - n);
41 i=i-nbits;
42 if (i<0)
43 return 0;
44 if (i==0)
45 return 1;
46 int lz=Integer.numberOfLeadingZeros(i);
47 int log=32-lz;
48 return (log+6)/7;
49 }
50
51 public static void encode(ByteBuffer buf, int n, int i)
52 {
53 if (n==8)
54 {
55 if (i < 0xFF)
56 {
57 buf.put((byte)i);
58 }
59 else
60 {
61 buf.put((byte)0xFF);
62
63 int length = i - 0xFF;
64 while (true)
65 {
66 if ((length & ~0x7F) == 0)
67 {
68 buf.put((byte)length);
69 return;
70 }
71 else
72 {
73 buf.put((byte)((length & 0x7F) | 0x80));
74 length >>>= 7;
75 }
76 }
77 }
78 }
79 else
80 {
81 int p=buf.position()-1;
82 int bits = 0xFF >>> (8 - n);
83
84 if (i < bits)
85 {
86 buf.put(p,(byte)((buf.get(p)&~bits)|i));
87 }
88 else
89 {
90 buf.put(p,(byte)(buf.get(p)|bits));
91
92 int length = i - bits;
93 while (true)
94 {
95 if ((length & ~0x7F) == 0)
96 {
97 buf.put((byte)length);
98 return;
99 }
100 else
101 {
102 buf.put((byte)((length & 0x7F) | 0x80));
103 length >>>= 7;
104 }
105 }
106 }
107 }
108 }
109
110 public static int decode(ByteBuffer buffer, int n)
111 {
112 if (n==8)
113 {
114 int nbits = 0xFF;
115
116 int i=buffer.get()&0xff;
117
118 if (i == nbits)
119 {
120 int m=1;
121 int b;
122 do
123 {
124 b = 0xff&buffer.get();
125 i = i + (b&127) * m;
126 m = m*128;
127 }
128 while ((b&128) == 128);
129 }
130 return i;
131 }
132
133 int nbits = 0xFF >>> (8 - n);
134
135 int i=buffer.get(buffer.position()-1)&nbits;
136
137 if (i == nbits)
138 {
139 int m=1;
140 int b;
141 do
142 {
143 b = 0xff&buffer.get();
144 i = i + (b&127) * m;
145 m = m*128;
146 }
147 while ((b&128) == 128);
148 }
149 return i;
150 }
151 }