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 )
         {