You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2006/09/08 00:25:25 UTC
svn commit: r441259 -
/directory/sandbox/akarasulu/apacheds-2.0/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java
Author: elecharny
Date: Thu Sep 7 15:25:25 2006
New Revision: 441259
URL: http://svn.apache.org/viewvc?view=rev&rev=441259
Log:
Added the getBytes method and some constants
Modified:
directory/sandbox/akarasulu/apacheds-2.0/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java
Modified: directory/sandbox/akarasulu/apacheds-2.0/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java
URL: http://svn.apache.org/viewvc/directory/sandbox/akarasulu/apacheds-2.0/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java?view=diff&rev=441259&r1=441258&r2=441259
==============================================================================
--- directory/sandbox/akarasulu/apacheds-2.0/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java (original)
+++ directory/sandbox/akarasulu/apacheds-2.0/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java Thu Sep 7 15:25:25 2006
@@ -44,6 +44,78 @@
*/
static final long serialVersionUID = 2L;
+ /** Integer limits for encoding */
+ private static final int ONE_BYTE_MAX = ( 1 << 7 ) - 1; // 0x7F
+
+ private static final int ONE_BYTE_MIN = -( 1 << 7 );
+
+ private static final int TWO_BYTE_MAX = ( 1 << 15 ) - 1; // 0x7FFF
+
+ private static final int TWO_BYTE_MIN = -( 1 << 15 );
+
+ private static final int THREE_BYTE_MAX = ( 1 << 23 ) - 1; // 0x7FFFFF
+
+ private static final int THREE_BYTE_MIN = -( 1 << 23 );
+
+ private static final int FOUR_BYTE_MAX = ( 1 << 31 ) - 1; // 0x7FFFFFFF
+
+ private static final int FOUR_BYTE_MIN = Integer.MIN_VALUE;
+
+ private final static byte[][] ONE_BYTE_VALS = new byte[][]
+ {
+ {0x00}, {0x01}, {0x02}, {0x03}, {0x04}, {0x05}, {0x06}, {0x07},
+ {0x08}, {0x09}, {0x0A}, {0x0B}, {0x0C}, {0x0D}, {0x0E}, {0x0F},
+ {0x10}, {0x11}, {0x12}, {0x13}, {0x14}, {0x15}, {0x16}, {0x17},
+ {0x18}, {0x19}, {0x1A}, {0x1B}, {0x1C}, {0x1D}, {0x1E}, {0x1F},
+ {0x20}, {0x21}, {0x22}, {0x23}, {0x24}, {0x25}, {0x26}, {0x27},
+ {0x28}, {0x29}, {0x2A}, {0x2B}, {0x2C}, {0x2D}, {0x2E}, {0x2F},
+ {0x30}, {0x31}, {0x32}, {0x33}, {0x34}, {0x35}, {0x36}, {0x37},
+ {0x38}, {0x39}, {0x3A}, {0x3B}, {0x3C}, {0x3D}, {0x3E}, {0x3F},
+ {0x40}, {0x41}, {0x42}, {0x43}, {0x44}, {0x45}, {0x46}, {0x47},
+ {0x48}, {0x49}, {0x4A}, {0x4B}, {0x4C}, {0x4D}, {0x4E}, {0x4F},
+ {0x50}, {0x51}, {0x52}, {0x53}, {0x54}, {0x55}, {0x56}, {0x57},
+ {0x58}, {0x59}, {0x5A}, {0x5B}, {0x5C}, {0x5D}, {0x5E}, {0x5F},
+ {0x60}, {0x61}, {0x62}, {0x63}, {0x64}, {0x65}, {0x66}, {0x67},
+ {0x68}, {0x69}, {0x6A}, {0x6B}, {0x6C}, {0x6D}, {0x6E}, {0x6F},
+ {0x70}, {0x71}, {0x72}, {0x73}, {0x74}, {0x75}, {0x76}, {0x77},
+ {0x78}, {0x79}, {0x7A}, {0x7B}, {0x7C}, {0x7D}, {0x7E}, {0x7F}
+ };
+
+ /**
+ * Utility function that return the number of bytes necessary to store an
+ * integer value. Note that this value must be in [Integer.MIN_VALUE,
+ * Integer.MAX_VALUE].
+ *
+ * @param value
+ * The value to store in a byte array
+ * @param sign
+ * The integer value sign
+ * @return The number of bytes necessary to store the value.
+ */
+ public static int getNbBytes( int value )
+ {
+ if ( value >= ONE_BYTE_MIN && value <= ONE_BYTE_MAX )
+ {
+ return 1;
+ }
+ else if ( value >= TWO_BYTE_MIN && value <= TWO_BYTE_MAX )
+ {
+ return 2;
+ }
+ else if ( value >= THREE_BYTE_MIN && value <= THREE_BYTE_MAX )
+ {
+ return 3;
+ }
+ else if ( value >= FOUR_BYTE_MIN && value <= FOUR_BYTE_MAX )
+ {
+ return 4;
+ }
+ else
+ {
+ return 5;
+ }
+ }
+
/**
* Encode an OctetString value
*
@@ -70,6 +142,87 @@
buffer.put( Length.getBytes( bytes.length ) );
buffer.put( bytes );
}
+ }
+ catch ( BufferOverflowException boe )
+ {
+ throw new ValueException( "The PDU buffer size is too small !" );
+ }
+
+ return;
+ }
+
+ /**
+ * Utility function that return a byte array representing the Value
+ *
+ * We must respect the ASN.1 BER encoding scheme :
+ * 1) positive integer
+ * - [0 - 0x7F] : 0xVV
+ * - [0x80 - 0xFF] : 0x00 0xVV
+ * - [0x0100 - 0x7FFF] : 0xVV 0xVV
+ * - [0x8000 - 0xFFFF] : 0x00 0xVV 0xVV
+ * - [0x010000 - 0x7FFFFF] : 0xVV 0xVV 0xVV
+ * - [0x800000 - 0xFFFFFF] : 0x00 0xVV 0xVV 0xVV
+ * - [0x01000000 - 0x7FFFFFFF] : 0xVV 0xVV 0xVV 0xVV
+ * - [0x80000000 - 0xFFFFFFFF] : 0x00 0xVV 0xVV 0xVV 0xVV
+ *
+ * 2) Negative number - (~value) + 1
+ *
+ * @param value The value to store in a byte array
+ * @param sign The value sign : positive or negative
+ *
+ * @return The byte array representing the value.
+ */
+ public static byte[] getBytes( int value )
+ {
+ byte[] bytes = null;
+
+ if ( value >= ONE_BYTE_MIN && value <= ONE_BYTE_MAX )
+ {
+ bytes = ONE_BYTE_VALS[value];
+ }
+ else if ( value >= TWO_BYTE_MIN && value <= TWO_BYTE_MAX )
+ {
+ bytes = new byte[2];
+ bytes[1] = ( byte ) value;
+ bytes[0] = ( byte ) ( value >> 8 );
+ }
+ else if ( value >= THREE_BYTE_MIN && value <= THREE_BYTE_MAX )
+ {
+ bytes = new byte[3];
+ bytes[2] = ( byte ) value;
+ bytes[1] = ( byte ) ( value >> 8 );
+ bytes[0] = ( byte ) ( value >> 16 );
+ }
+ else if ( value >= FOUR_BYTE_MIN && value <= FOUR_BYTE_MAX )
+ {
+ bytes = new byte[4];
+ bytes[3] = ( byte ) value;
+ bytes[2] = ( byte ) ( value >> 8 );
+ bytes[1] = ( byte ) ( value >> 16 );
+ bytes[0] = ( byte ) ( value >> 24 );
+ }
+
+ return bytes;
+ }
+
+ /**
+ * Encode an integer value
+ *
+ * @param buffer The PDU in which the value will be put
+ * @param value The integer to be encoded
+ */
+ public static void encode( ByteBuffer buffer, int value ) throws ValueException
+ {
+ if ( buffer == null )
+ {
+ throw new ValueException( "Cannot put a PDU in a null buffer !" );
+ }
+
+ try
+ {
+ buffer.put( UniversalTags.INTEGER.getValue() );
+ buffer.put( ( byte ) getNbBytes( value ) );
+ buffer.put( getBytes( value ) );
}
catch ( BufferOverflowException boe )
{