View Javadoc
1   /*
2    * Copyright 2012 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  package org.jboss.netty.buffer;
17  
18  import java.nio.ByteOrder;
19  
20  
21  /**
22   * A big-endian Java heap buffer.  It is recommended to use {@link ChannelBuffers#buffer(int)}
23   * and {@link ChannelBuffers#wrappedBuffer(byte[])} instead of calling the
24   * constructor explicitly.
25   */
26  public class BigEndianHeapChannelBuffer extends HeapChannelBuffer {
27  
28      /**
29       * Creates a new big-endian heap buffer with a newly allocated byte array.
30       *
31       * @param length the length of the new byte array
32       */
33      public BigEndianHeapChannelBuffer(int length) {
34          super(length);
35      }
36  
37      /**
38       * Creates a new big-endian heap buffer with an existing byte array.
39       *
40       * @param array the byte array to wrap
41       */
42      public BigEndianHeapChannelBuffer(byte[] array) {
43          super(array);
44      }
45  
46      private BigEndianHeapChannelBuffer(byte[] array, int readerIndex, int writerIndex) {
47          super(array, readerIndex, writerIndex);
48      }
49  
50      public ChannelBufferFactory factory() {
51          return HeapChannelBufferFactory.getInstance(ByteOrder.BIG_ENDIAN);
52      }
53  
54      public ByteOrder order() {
55          return ByteOrder.BIG_ENDIAN;
56      }
57  
58      public short getShort(int index) {
59          return (short) (array[index] << 8 | array[index + 1] & 0xFF);
60      }
61  
62      public int getUnsignedMedium(int index) {
63          return  (array[index]     & 0xff) << 16 |
64                  (array[index + 1] & 0xff) <<  8 |
65                  array[index + 2] & 0xff;
66      }
67  
68      public int getInt(int index) {
69          return  (array[index]     & 0xff) << 24 |
70                  (array[index + 1] & 0xff) << 16 |
71                  (array[index + 2] & 0xff) <<  8 |
72                  array[index + 3] & 0xff;
73      }
74  
75      public long getLong(int index) {
76          return  ((long) array[index]     & 0xff) << 56 |
77                  ((long) array[index + 1] & 0xff) << 48 |
78                  ((long) array[index + 2] & 0xff) << 40 |
79                  ((long) array[index + 3] & 0xff) << 32 |
80                  ((long) array[index + 4] & 0xff) << 24 |
81                  ((long) array[index + 5] & 0xff) << 16 |
82                  ((long) array[index + 6] & 0xff) <<  8 |
83                  (long) array[index + 7] & 0xff;
84      }
85  
86      public void setShort(int index, int value) {
87          array[index]     = (byte) (value >>> 8);
88          array[index + 1] = (byte) value;
89      }
90  
91      public void setMedium(int index, int   value) {
92          array[index]     = (byte) (value >>> 16);
93          array[index + 1] = (byte) (value >>> 8);
94          array[index + 2] = (byte) value;
95      }
96  
97      public void setInt(int index, int   value) {
98          array[index]     = (byte) (value >>> 24);
99          array[index + 1] = (byte) (value >>> 16);
100         array[index + 2] = (byte) (value >>> 8);
101         array[index + 3] = (byte) value;
102     }
103 
104     public void setLong(int index, long  value) {
105         array[index]     = (byte) (value >>> 56);
106         array[index + 1] = (byte) (value >>> 48);
107         array[index + 2] = (byte) (value >>> 40);
108         array[index + 3] = (byte) (value >>> 32);
109         array[index + 4] = (byte) (value >>> 24);
110         array[index + 5] = (byte) (value >>> 16);
111         array[index + 6] = (byte) (value >>> 8);
112         array[index + 7] = (byte) value;
113     }
114 
115     public ChannelBuffer duplicate() {
116         return new BigEndianHeapChannelBuffer(array, readerIndex(), writerIndex());
117     }
118 
119     public ChannelBuffer copy(int index, int length) {
120         if (index < 0 || length < 0 || index + length > array.length) {
121           throw new IndexOutOfBoundsException("Too many bytes to copy - Need "
122                   + (index + length) + ", maximum is " + array.length);
123         }
124 
125         byte[] copiedArray = new byte[length];
126         System.arraycopy(array, index, copiedArray, 0, length);
127         return new BigEndianHeapChannelBuffer(copiedArray);
128     }
129 }