View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
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 }