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/12/31 16:10:10 UTC
svn commit: r491429 - in /directory/trunks/shared/asn1/src:
main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java
test/java/org/apache/directory/shared/asn1/ber/tlv/ValueTest.java
Author: elecharny
Date: Sun Dec 31 07:10:09 2006
New Revision: 491429
URL: http://svn.apache.org/viewvc?view=rev&rev=491429
Log:
Fixed a nasty bug: integer transformation to bytes wasn't handling negative values correctly. Even if we don't have any negative values in LDAP, as this library is shared, it has to be fixed
Modified:
directory/trunks/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java
directory/trunks/shared/asn1/src/test/java/org/apache/directory/shared/asn1/ber/tlv/ValueTest.java
Modified: directory/trunks/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java
URL: http://svn.apache.org/viewvc/directory/trunks/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java?view=diff&rev=491429&r1=491428&r2=491429
==============================================================================
--- directory/trunks/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java (original)
+++ directory/trunks/shared/asn1/src/main/java/org/apache/directory/shared/asn1/ber/tlv/Value.java Sun Dec 31 07:10:09 2006
@@ -76,11 +76,6 @@
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;
-
-
// ~ Methods
// ------------------------------------------------------------------------------------
@@ -232,13 +227,9 @@
{
return 3;
}
- else if ( value >= FOUR_BYTE_MIN && value <= FOUR_BYTE_MAX )
- {
- return 4;
- }
else
{
- return 5;
+ return 4;
}
}
@@ -254,7 +245,6 @@
* - [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
@@ -265,31 +255,78 @@
{
byte[] bytes = null;
- if ( value >= ONE_BYTE_MIN && value <= ONE_BYTE_MAX )
+ if ( value >= 0 )
{
- bytes = new byte[1];
- bytes[0] = ( byte ) value;
+ if ( ( value >= 0 ) && ( value <= ONE_BYTE_MAX ) )
+ {
+ bytes = new byte[1];
+ bytes[0] = ( byte ) value;
+ }
+ else if ( ( value > ONE_BYTE_MAX ) && ( value <= TWO_BYTE_MAX ) )
+ {
+ bytes = new byte[2];
+ bytes[1] = ( byte ) value;
+ bytes[0] = ( byte ) ( value >> 8 );
+ }
+ else if ( ( value > TWO_BYTE_MAX ) && ( value <= THREE_BYTE_MAX ) )
+ {
+ bytes = new byte[3];
+ bytes[2] = ( byte ) value;
+ bytes[1] = ( byte ) ( value >> 8 );
+ bytes[0] = ( byte ) ( value >> 16 );
+ }
+ else
+ {
+ bytes = new byte[4];
+ bytes[3] = ( byte ) value;
+ bytes[2] = ( byte ) ( value >> 8 );
+ bytes[1] = ( byte ) ( value >> 16 );
+ bytes[0] = ( byte ) ( value >> 24 );
+ }
}
- 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 )
+ else
{
- bytes = new byte[4];
- bytes[3] = ( byte ) value;
- bytes[2] = ( byte ) ( value >> 8 );
- bytes[1] = ( byte ) ( value >> 16 );
- bytes[0] = ( byte ) ( value >> 24 );
+ // On special case : 0x80000000
+ if ( value == 0x80000000 )
+ {
+ bytes = new byte[4];
+ bytes[3] = ( byte ) value;
+ bytes[2] = ( byte ) ( value >> 8 );
+ bytes[1] = ( byte ) ( value >> 16 );
+ bytes[0] = ( byte ) ( value >> 24 );
+ }
+ else
+ {
+ // We have to compute the complement, and add 1
+ //value = ( ~value ) + 1;
+
+ if ( value >= 0xFFFFFF80 )
+ {
+ bytes = new byte[1];
+ bytes[0] = ( byte ) value;
+ }
+ else if ( value >= 0xFFFF8000 )
+ {
+ bytes = new byte[2];
+ bytes[1] = ( byte ) ( value & 0x000000FF );
+ bytes[0] = ( byte ) ( value >> 8 );
+ }
+ else if ( value >= 0xFF800000 )
+ {
+ bytes = new byte[3];
+ bytes[2] = ( byte ) value ;
+ bytes[1] = ( byte ) ( value >> 8 );
+ bytes[0] = ( byte ) ( value >> 16 );
+ }
+ else
+ {
+ 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;
Modified: directory/trunks/shared/asn1/src/test/java/org/apache/directory/shared/asn1/ber/tlv/ValueTest.java
URL: http://svn.apache.org/viewvc/directory/trunks/shared/asn1/src/test/java/org/apache/directory/shared/asn1/ber/tlv/ValueTest.java?view=diff&rev=491429&r1=491428&r2=491429
==============================================================================
--- directory/trunks/shared/asn1/src/test/java/org/apache/directory/shared/asn1/ber/tlv/ValueTest.java (original)
+++ directory/trunks/shared/asn1/src/test/java/org/apache/directory/shared/asn1/ber/tlv/ValueTest.java Sun Dec 31 07:10:09 2006
@@ -42,17 +42,169 @@
*/
public void testValueGetNbBytes()
{
- Assert.assertEquals( 1, Value.getNbBytes( 0 ) );
- Assert.assertEquals( 1, Value.getNbBytes( 1 ) );
- Assert.assertEquals( 2, Value.getNbBytes( 255 ) );
- Assert.assertEquals( 2, Value.getNbBytes( 256 ) );
- Assert.assertEquals( 3, Value.getNbBytes( 65535 ) );
- Assert.assertEquals( 3, Value.getNbBytes( 65536 ) );
- Assert.assertEquals( 4, Value.getNbBytes( 16777215 ) );
- Assert.assertEquals( 4, Value.getNbBytes( 16777216 ) );
- Assert.assertEquals( 1, Value.getNbBytes( -1 ) );
+ assertEquals( 1, Value.getNbBytes( 0x00000000 ) );
+ assertEquals( 1, Value.getNbBytes( 0x00000001 ) );
+ assertEquals( 2, Value.getNbBytes( 0x000000FF ) );
+ assertEquals( 2, Value.getNbBytes( 0x00000100 ) );
+ assertEquals( 3, Value.getNbBytes( 0x0000FFFF ) );
+ assertEquals( 3, Value.getNbBytes( 0x00010000 ) );
+ assertEquals( 4, Value.getNbBytes( 0x00FFFFFF ) );
+ assertEquals( 4, Value.getNbBytes( 0x01000000 ) );
+ assertEquals( 1, Value.getNbBytes( -1 ) );
+ assertEquals( 4, Value.getNbBytes( 0x7FFFFFFF ) );
+ assertEquals( 1, Value.getNbBytes( 0xFFFFFFFF ) );
}
+ public void testGetBytes()
+ {
+ byte[] bb = Value.getBytes( 0x00000000 );
+ assertEquals( 1, bb.length );
+ assertEquals( 0, bb[0] );
+
+ bb = Value.getBytes( 0x00000001 );
+ assertEquals( 1, bb.length );
+ assertEquals( 1, bb[0] );
+
+ bb = Value.getBytes( 0x0000007F );
+ assertEquals( 1, bb.length );
+ assertEquals( 0x7F, bb[0] );
+
+ bb = Value.getBytes( 0x00000080 );
+ assertEquals( 2, bb.length );
+ assertEquals( 0x00, bb[0] );
+ assertEquals( (byte)0x80, bb[1] );
+
+ bb = Value.getBytes( 0x000000FF );
+ assertEquals( 2, bb.length );
+ assertEquals( 0x00, bb[0] );
+ assertEquals( (byte)0xFF, bb[1] );
+
+ bb = Value.getBytes( 0x00007FFF );
+ assertEquals( 2, bb.length );
+ assertEquals( 0x7F, bb[0] );
+ assertEquals( (byte)0xFF, bb[1] );
+
+ bb = Value.getBytes( 0x00008000 );
+ assertEquals( 3, bb.length );
+ assertEquals( 0x00, bb[0] );
+ assertEquals( (byte)0x80, bb[1] );
+ assertEquals( 0x00, bb[2] );
+
+ bb = Value.getBytes( 0x0000FFFF );
+ assertEquals( 3, bb.length );
+ assertEquals( 0x00, bb[0] );
+ assertEquals( (byte)0xFF, bb[1] );
+ assertEquals( (byte)0xFF, bb[2] );
+
+ bb = Value.getBytes( 0x00010000 );
+ assertEquals( 3, bb.length );
+ assertEquals( 0x01, bb[0] );
+ assertEquals( 0x00, bb[1] );
+ assertEquals( 0x00, bb[2] );
+
+ bb = Value.getBytes( 0x007FFFFF );
+ assertEquals( 3, bb.length );
+ assertEquals( 0x7F, bb[0] );
+ assertEquals( (byte)0xFF, bb[1] );
+ assertEquals( (byte)0xFF, bb[2] );
+
+ bb = Value.getBytes( 0x00800000 );
+ assertEquals( 4, bb.length );
+ assertEquals( 0x00, bb[0] );
+ assertEquals( (byte)0x80, bb[1] );
+ assertEquals( 0x00, bb[2] );
+ assertEquals( 0x00, bb[3] );
+
+ bb = Value.getBytes( 0x00FFFFFF );
+ assertEquals( 4, bb.length );
+ assertEquals( 0x00, bb[0] );
+ assertEquals( (byte)0xFF, bb[1] );
+ assertEquals( (byte)0xFF, bb[2] );
+ assertEquals( (byte)0xFF, bb[3] );
+
+ bb = Value.getBytes( 0x01000000 );
+ assertEquals( 4, bb.length );
+ assertEquals( 0x01, bb[0] );
+ assertEquals( 0x00, bb[1] );
+ assertEquals( 0x00, bb[2] );
+ assertEquals( 0x00, bb[3] );
+
+ bb = Value.getBytes( 0x7FFFFFFF );
+ assertEquals( 4, bb.length );
+ assertEquals( 0x7F, bb[0] );
+ assertEquals( (byte)0xFF, bb[1] );
+ assertEquals( (byte)0xFF, bb[2] );
+ assertEquals( (byte)0xFF, bb[3] );
+
+ bb = Value.getBytes( 0x80000000 );
+ assertEquals( 4, bb.length );
+ assertEquals( (byte)0x80, bb[0] );
+ assertEquals( (byte)0x00, bb[1] );
+ assertEquals( (byte)0x00, bb[2] );
+ assertEquals( (byte)0x00, bb[3] );
+
+ bb = Value.getBytes( 0xFFFFFFFF );
+ assertEquals( 1, bb.length );
+ assertEquals( (byte)0xFF, bb[0] );
+
+ bb = Value.getBytes( 0xFFFFFF80 );
+ assertEquals( 1, bb.length );
+ assertEquals( (byte)0x80, bb[0] );
+
+ bb = Value.getBytes( 0xFFFFFF7F );
+ assertEquals( 2, bb.length );
+ assertEquals( (byte)0xFF, bb[0] );
+ assertEquals( 0x7F, bb[1] );
+
+ bb = Value.getBytes( 0xFFFFFF00 );
+ assertEquals( 2, bb.length );
+ assertEquals( (byte)0xFF, bb[0] );
+ assertEquals( 0x00, bb[1] );
+
+ bb = Value.getBytes( 0xFFFF8000 );
+ assertEquals( 2, bb.length );
+ assertEquals( (byte)0x80, bb[0] );
+ assertEquals( 0x00, bb[1] );
+
+ bb = Value.getBytes( 0xFFFF7FFF );
+ assertEquals( 3, bb.length );
+ assertEquals( (byte)0xFF, bb[0] );
+ assertEquals( 0x7F, bb[1] );
+ assertEquals( (byte)0xFF, bb[2] );
+
+ bb = Value.getBytes( 0xFFFF0000 );
+ assertEquals( 3, bb.length );
+ assertEquals( (byte)0xFF, bb[0] );
+ assertEquals( 0x00, bb[1] );
+ assertEquals( 0x00, bb[2] );
+
+ bb = Value.getBytes( 0xFF800000 );
+ assertEquals( 3, bb.length );
+ assertEquals( (byte)0x80, bb[0] );
+ assertEquals( 0x00, bb[1] );
+ assertEquals( 0x00, bb[2] );
+
+ bb = Value.getBytes( 0xFF7FFFFF );
+ assertEquals( 4, bb.length );
+ assertEquals( (byte)0xFF, bb[0] );
+ assertEquals( 0x7F, bb[1] );
+ assertEquals( (byte)0xFF, bb[2] );
+ assertEquals( (byte)0xFF, bb[3] );
+
+ bb = Value.getBytes( 0xFF000000 );
+ assertEquals( 4, bb.length );
+ assertEquals( (byte)0xFF, bb[0] );
+ assertEquals( 0x00, bb[1] );
+ assertEquals( 0x00, bb[2] );
+ assertEquals( 0x00, bb[3] );
+
+ bb = Value.getBytes( 0x80000000 );
+ assertEquals( 4, bb.length );
+ assertEquals( (byte)0x80, bb[0] );
+ assertEquals( 0x00, bb[1] );
+ assertEquals( 0x00, bb[2] );
+ assertEquals( 0x00, bb[3] );
+ }
public void testEncodeInt2Bytes()
{