JAVA 所有包

源代码在线查看: berencoder.java

软件大小: 18810 K
上传用户: woshishenb
关键词: JAVA
下载地址: 免注册下载 普通下载 VIP

相关代码

				/*				 * @(#)file      BerEncoder.java				 * @(#)author    Sun Microsystems, Inc.				 * @(#)version   4.17				 * @(#)date      07/03/14				 *				 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.				 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.				 *				 */												package com.sun.jmx.snmp;												/**				 * The BerEncoder class is used for encoding data using BER. 				 *				 * A BerEncoder needs to be set up with a byte buffer. The encoded				 * data are stored in this byte buffer.				 * 				 * NOTE : the buffer is filled from end to start. This means the caller				 * needs to encode its data in the reverse order.				 *				 *				 * This API is a Sun Microsystems internal API  and is subject 				 * to change without notice.				 * @version     4.17     11/17/05				 * @author      Sun Microsystems, Inc				 *				 * @since 1.5				 */								public class BerEncoder {								  /**				  * Constructs a new encoder and attaches it to the specified byte string.				  * 				  * @param b The byte string containing the encoded data.				  */								  public BerEncoder(byte b[]) {				    bytes = b ;				    start = b.length ;				    stackTop = 0 ;				  }												  /**				  * Trim the encoding data and returns the length of the encoding.				  *				  * The encoder does backward encoding : so the bytes buffer is				  * filled from end to start. The encoded data must be shift before				  * the buffer can be used. This is the purpose of the trim method. 				  *				  * After a call to the trim method, the encoder is reinitialized and putXXX 				  * overwrite any existing encoded data.				  *				  * @return The length of the encoded data.				  */								  public int trim() {				    final int result = bytes.length - start ;								    // for (int i = start ; i < bytes.length ; i++) {				    //  bytes[i-start] = bytes[i] ;				    // }				    if (result > 0)  					java.lang.System.arraycopy(bytes,start,bytes,0,result);								    start = bytes.length ;				    stackTop = 0 ;				    				    return result ;				  }				  				  /**				  * Put an integer.				  *				  * @param v The integer to encode.				  */								  public void putInteger(int v) {				    putInteger(v, IntegerTag) ;				  }												  /**				  * Put an integer with the specified tag.				  * 				  * @param v The integer to encode.				  * @param tag The tag to encode.				  */								  public void putInteger(int v, int tag) {				    putIntegerValue(v) ;				    putTag(tag) ;				  }																  /**				  * Put an integer expressed as a long.				  *				  * @param v The long to encode.				  */								  public void putInteger(long v) {				    putInteger(v, IntegerTag) ;				  }												  /**				  * Put an integer expressed as a long with the specified tag.				  * 				  * @param v The long to encode				  * @param tag The tag to encode.				  */								  public void putInteger(long v, int tag) {				    putIntegerValue(v) ;				    putTag(tag) ;				  }																  /**				  * Put an octet string.				  * 				  * @param s The bytes to encode				  */								  public void putOctetString(byte[] s) {				    putOctetString(s, OctetStringTag) ;				  }				  								  /**				  * Put an octet string with a specified tag.				  * 				  * @param s The bytes to encode				  * @param tag The tag to encode.				  */								  public void putOctetString(byte[] s, int tag) {				    putStringValue(s) ;				    putTag(tag) ;				  }												  /**				  * Put an object identifier.				  *				  * @param s The oid to encode.				  */								  public void putOid(long[] s) {				    putOid(s, OidTag) ;				  }				  								  /**				  * Put an object identifier with a specified tag.				  * 				  * @param s The integer to encode.				  * @param tag The tag to encode.				  */								  public void putOid(long[] s, int tag) {				    putOidValue(s) ;				    putTag(tag) ;				  }												  /**				  * Put a NULL value.				  */								  public void putNull() {				    putNull(NullTag) ;				  }												  /**				  * Put a NULL value with a specified tag.				  * 				  * @param tag The tag to encode.				  */								  public void putNull(int tag) {				    putLength(0) ;				    putTag(tag) ;				  }				  				  								  /**				  * Put an ANY value. In fact, this method does not encode anything.				  * It simply copies the specified bytes into the encoding.				  * 				  * @param s The encoding of the ANY value.				  */								  public void putAny(byte[] s) {				  	putAny(s, s.length) ;				  }												  /**				  * Put an ANY value. Only the first byteCount are considered.				  * 				  * @param s The encoding of the ANY value.				  * @param byteCount The number of bytes of the encoding.				  */								  public void putAny(byte[] s, int byteCount) {				      java.lang.System.arraycopy(s,0,bytes,start-byteCount,byteCount);				      start -= byteCount;				      //    for (int i = byteCount - 1 ; i >= 0 ; i--) {				      //      bytes[--start] = s[i] ;				      //    }				  }												  /**				  * Open a sequence.				  * The encoder push the current position on its stack.				  */								  public void openSequence() {				    stackBuf[stackTop++] = start ;				  }												  /**				  * Close a sequence.				  * The decode pull the stack to know the end of the current sequence.				  */								  public void closeSequence() {				    closeSequence(SequenceTag) ;				  }				  				  				  /**				  * Close a sequence with the specified tag.				  */								  public void closeSequence(int tag) {				    final int end = stackBuf[--stackTop] ;				    putLength(end - start) ;				    putTag(tag) ;				  }												  //				  // Some standard tags				  //				  public final static int BooleanTag      = 1 ;				  public final static int IntegerTag      = 2 ;				  public final static int OctetStringTag  = 4 ;				  public final static int NullTag          = 5 ;				  public final static int OidTag          = 6 ;				  public final static int SequenceTag      = 0x30 ;																				  ////////////////////////// PROTECTED ///////////////////////////////																  /**				  * Put a tag and move the current position backward.				  *				  * @param tag The tag to encode.				  */								  protected final void putTag(int tag) {				    if (tag < 256) {				      bytes[--start] = (byte)tag ;				    }				    else {				      while (tag != 0) {				        bytes[--start] = (byte)(tag & 127) ;				        tag = tag 				      }				    }				  }												  /**				  * Put a length and move the current position backward.				  * 				  * @param length The length to encode.				  */								  protected final void putLength(final int length) {				    if (length < 0) {				      throw new IllegalArgumentException() ;				    }				    else if (length < 128) {				      bytes[--start] = (byte)length ;				    }				    else if (length < 256) {				      bytes[--start] = (byte)length ;				      bytes[--start] = (byte)0x81 ;				    }				    else if (length < 65536) {				      bytes[--start] = (byte)(length) ;				      bytes[--start] = (byte)(length >> 8) ;				      bytes[--start] = (byte)0x82 ;				    }				    else if (length < 16777126) {				      bytes[--start] = (byte)(length) ;				      bytes[--start] = (byte)(length >> 8) ;				      bytes[--start] = (byte)(length >> 16) ;				      bytes[--start] = (byte)0x83 ;				    }				    else {				      bytes[--start] = (byte)(length) ;				      bytes[--start] = (byte)(length >> 8) ;				      bytes[--start] = (byte)(length >> 16) ;				      bytes[--start] = (byte)(length >> 24) ;				      bytes[--start] = (byte)0x84 ;				    }				  }				  								  /**				  * Put an integer value and move the current position backward.				  * 				  * @param v The integer to encode.				  */								  protected final void putIntegerValue(int v) {				    final int end = start ;				    int mask = 0x7f800000 ;				    int byteNeeded = 4 ;				    if (v < 0) {				      while (((mask & v) == mask) && (byteNeeded > 1)) {				        mask = mask >> 8 ;				        byteNeeded-- ;				      }				    }				    else {				      while (((mask & v) == 0) && (byteNeeded > 1)) {				        mask = mask >> 8 ;				        byteNeeded-- ;				      }				    }				    for (int i = 0 ; i < byteNeeded ; i++) {				      bytes[--start] = (byte)v ;				      v =  v >> 8 ;				    }				    putLength(end - start) ;				  }				  				  				  /**				  * Put an integer value expressed as a long.				  * 				  * @param v The integer to encode.				  */								  protected final void putIntegerValue(long v) {				    final int end = start ;				    long mask = 0x7f80000000000000L ;				    int byteNeeded = 8 ;				    if (v < 0) {				      while (((mask & v) == mask) && (byteNeeded > 1)) {				        mask = mask >> 8 ;				        byteNeeded-- ;				      }				    }				    else {				      while (((mask & v) == 0) && (byteNeeded > 1)) {				        mask = mask >> 8 ;				        byteNeeded-- ;				      }				    }				    for (int i = 0 ; i < byteNeeded ; i++) {				      bytes[--start] = (byte)v ;				      v =  v >> 8 ;				    }				    putLength(end - start) ;				  }				  				  				  /**				  * Put a byte string and move the current position backward.				  * 				  * @param s The byte string to encode.				  */								  protected final void putStringValue(byte[] s) {				      final int datalen = s.length;				      java.lang.System.arraycopy(s,0,bytes,start-datalen,datalen);				      start -= datalen;				      // for (int i = s.length - 1 ; i >= 0 ; i--) {				      //   bytes[--start] = s[i] ;				      // }				      putLength(datalen) ;				  }																  /**				  * Put an oid and move the current position backward.				  * 				  * @param s The oid to encode.				  */								  protected final void putOidValue(final long[] s) {				      final int end = start ;				      final int slength = s.length;								      // bugId 4641746: 0, 1, and 2 are legal values.				      if ((slength < 2) || (s[0] > 2) || (s[1] >= 40)) {					  throw new IllegalArgumentException() ;				      }				      for (int i = slength - 1 ; i >= 2 ; i--) {					  long c = s[i] ;					  if (c < 0) {					      throw new IllegalArgumentException() ;					  }					  else if (c < 128) {					      bytes[--start] = (byte)c ;					  }					  else {					      bytes[--start] = (byte)(c & 127) ;					      c = c >> 7 ;					      while (c != 0) {						  bytes[--start] = (byte)(c | 128) ;						  c = c >> 7 ;					      }					  }				      }				      bytes[--start] = (byte)(s[0] * 40 + s[1]) ;				      putLength(end - start) ;				  }				  								  //				  // This is the byte array containing the encoding.				  //				  protected final byte bytes[];				  				  //				  // This is the index of the first byte of the encoding.				  // It is initialized to bytes.length and decrease each time				  // an value is put in the encoder.				  //				  protected int start = -1 ;				  				  //				  // This is the stack where end of sequences are kept.				  // A value is computed and pushed in it each time the openSequence method				  // is invoked.				  // A value is pulled and checked each time the closeSequence method is called.				  //				  protected final int stackBuf[] = new int[200] ;				  protected int stackTop = 0 ;				  				}															

相关资源