Author: bayard
Date: Fri May 18 16:44:30 2007
New Revision: 539638

URL: http://svn.apache.org/viewvc?view=rev&rev=539638
Log:
Applying Hiroshi's test from IO-117 with my fix. Fixes negative number 
possibilities in EndianUtils.readSwappedUnsignedInteger()

Modified:
    
jakarta/commons/proper/io/branches/b1_3/src/java/org/apache/commons/io/EndianUtils.java
    
jakarta/commons/proper/io/branches/b1_3/src/test/org/apache/commons/io/EndianUtilsTest.java

Modified: 
jakarta/commons/proper/io/branches/b1_3/src/java/org/apache/commons/io/EndianUtils.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/io/branches/b1_3/src/java/org/apache/commons/io/EndianUtils.java?view=diff&rev=539638&r1=539637&r2=539638
==============================================================================
--- 
jakarta/commons/proper/io/branches/b1_3/src/java/org/apache/commons/io/EndianUtils.java
 (original)
+++ 
jakarta/commons/proper/io/branches/b1_3/src/java/org/apache/commons/io/EndianUtils.java
 Fri May 18 16:44:30 2007
@@ -182,10 +182,13 @@
      * @return the value read
      */
     public static long readSwappedUnsignedInteger(byte[] data, int offset) {
-        return ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
-            ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
-            ( ( data[ offset + 2 ] & 0xff ) << 16 ) +
-            ( ( data[ offset + 3 ] & 0xff ) << 24 ) );
+        long low = ( ( ( data[ offset + 0 ] & 0xff ) << 0 ) +
+                     ( ( data[ offset + 1 ] & 0xff ) << 8 ) +
+                     ( ( data[ offset + 2 ] & 0xff ) << 16 ) );
+
+        long high = data[ offset + 3 ] & 0xff;
+
+        return (high << 24) + (0xffffffffL & low); 
     }
 
     /**
@@ -368,10 +371,13 @@
         int value3 = read( input );
         int value4 = read( input );
 
-        return ( ( value1 & 0xff ) << 0 ) +
-            ( ( value2 & 0xff ) << 8 ) +
-            ( ( value3 & 0xff ) << 16 ) +
-            ( ( value4 & 0xff ) << 24 );
+        long low = ( ( ( value1 & 0xff ) << 0 ) +
+                     ( ( value2 & 0xff ) << 8 ) +
+                     ( ( value3 & 0xff ) << 16 ) );
+
+        long high = value4 & 0xff;
+
+        return (high << 24) + (0xffffffffL & low); 
     }
 
     /**

Modified: 
jakarta/commons/proper/io/branches/b1_3/src/test/org/apache/commons/io/EndianUtilsTest.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/io/branches/b1_3/src/test/org/apache/commons/io/EndianUtilsTest.java?view=diff&rev=539638&r1=539637&r2=539638
==============================================================================
--- 
jakarta/commons/proper/io/branches/b1_3/src/test/org/apache/commons/io/EndianUtilsTest.java
 (original)
+++ 
jakarta/commons/proper/io/branches/b1_3/src/test/org/apache/commons/io/EndianUtilsTest.java
 Fri May 18 16:44:30 2007
@@ -263,4 +263,17 @@
         }
     }
 
+    // tests #IO-117
+    public void testUnsignedOverrun() throws Exception {
+        byte[] target = new byte[] { 0, 0, 0, (byte)0x80 };
+        long expected = 0x80000000L;
+    
+        long actual = EndianUtils.readSwappedUnsignedInteger(target, 0);
+        assertEquals("readSwappedUnsignedInteger(byte[], int) was incorrect", 
expected, actual);
+
+        ByteArrayInputStream in = new ByteArrayInputStream(target);
+        actual = EndianUtils.readSwappedUnsignedInteger(in);
+        assertEquals("readSwappedUnsignedInteger(InputStream) was incorrect", 
expected, actual);
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to