You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Duncan Jones <du...@wortharead.com> on 2014/02/01 09:06:55 UTC

Re: svn commit: r1563259 - in /commons/proper/lang/trunk: pom.xml src/changes/changes.xml src/main/java/org/apache/commons/lang3/math/NumberUtils.java src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java

On 31 January 2014 22:44, Jörg Schaible <jo...@gmx.de> wrote:
>
> -1
>
> Please revert, we have that already in org.apache.commons.lang3.Conversion

Thanks for pointing that out. I've reverted.

I agree it looks like Conversion might be a better place to put the
functionality. It seems what I've added is equivalent to (the not yet
implemented) Conversion.intToByteArrayBe(),
Conversion.byteArrayBeToInt() and so on. So perhaps to close LANG-341,
those methods will need to be implemented.

Any thoughts on the double/float methods included in LANG-341? I
wasn't 100% sure of those anyway, but they didn't hurt when being
added to NumberUtils. Is there a place for those in Conversion?

Duncan


>
> --------------- Weitergeleitete Nachricht (Anfang)
>
> Betreff: svn commit: r1563259 - in /commons/proper/lang/trunk: pom.xml
> src/changes/changes.xml
> src/main/java/org/apache/commons/lang3/math/NumberUtils.java
> src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
> Absender: djones-1oDqGaOF3Lkdnm+yROfE0A@public.gmane.org
> Datum: Fri, 31 Jan 2014 21:12:58 +0000
> Newsgruppe: gmane.comp.jakarta.commons.scm
>
> Author: djones
> Date: Fri Jan 31 21:12:57 2014
> New Revision: 1563259
>
> URL: http://svn.apache.org/r1563259
> Log:
> LANG-341: Please add number to byte[] methods. Suggested by Lilianne E. Blaze.
> Final patch from Vincent Ricard (with thanks to Henri Yandell).
>
> Modified:
>     commons/proper/lang/trunk/pom.xml
>     commons/proper/lang/trunk/src/changes/changes.xml
>     commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
>     commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
>
> Modified: commons/proper/lang/trunk/pom.xml
> URL:
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/pom.xml?rev=1563259&r1=1563258&r2=1563259&view=diff
> ==============================================================================
> --- commons/proper/lang/trunk/pom.xml (original)
> +++ commons/proper/lang/trunk/pom.xml Fri Jan 31 21:12:57 2014
> @@ -365,6 +365,9 @@
>        <name>Travis Reeder</name>
>      </contributor>
>      <contributor>
> +      <name>Vincent Ricard</name>
> +    </contributor>
> +    <contributor>
>        <name>Antony Riley</name>
>      </contributor>
>      <contributor>
>
> Modified: commons/proper/lang/trunk/src/changes/changes.xml
> URL:
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/changes/changes.xml?rev=1563259&r1=1563258&r2=1563259&view=diff
> ==============================================================================
> --- commons/proper/lang/trunk/src/changes/changes.xml [utf-8] (original)
> +++ commons/proper/lang/trunk/src/changes/changes.xml [utf-8] Fri Jan 31
> 21:12:57 2014
> @@ -22,6 +22,7 @@
>    <body>
>
>    <release version="3.3" date="TBA" description="Bugfix and Feature release">
> +    <action issue="LANG-341" type="add" due-to="Vincent Ricard"
> dev="djones">Please add number to byte[] methods</action>
>      <action issue="LANG-961" type="update"
> dev="ggregory">org.apache.commons.lang3.reflect.FieldUtils.removeFinalModifier(Field)
> does not clean up after itself</action>
>      <action issue="LANG-958" type="update" dev="chas">FastDateParser javadoc
> incorrectly states that SimpleDateFormat is used internally</action>
>      <action issue="LANG-637" type="add" dev="djones">There should be a
> DifferenceBuilder with a ReflectionDifferenceBuilder implementation</action>
>
> Modified:
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
> URL:
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java?rev=1563259&r1=1563258&r2=1563259&view=diff
> ==============================================================================
> ---
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
> (original)
> +++
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/math/NumberUtils.java
> Fri Jan 31 21:12:57 2014
> @@ -21,6 +21,7 @@ import java.math.BigDecimal;
>  import java.math.BigInteger;
>
>  import org.apache.commons.lang3.StringUtils;
> +import org.apache.commons.lang3.Validate;
>
>  /**
>   * <p>Provides extra functionality for Java Number classes.</p>
> @@ -1433,4 +1434,239 @@ public class NumberUtils {
>          return !allowSigns && foundDigit;
>      }
>
> +    // NOTE: toPrimitive(byte[]) method contents are taken from:
> +    //
> http://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/DataInputStream.java
> +    // toByteArray(primitive) method contents are taken from:
> +    //
> http://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/DataOutputStream.java
> +
> +
> +    /**
> +     * <p>
> +     * Converts a byte array to a {@code short}.
> +     * </p>
> +     * <p>
> +     * The first two bytes of the
> +     * array are converted from two's complement representation to a {@code
> short}.
> +     * Any additional bytes are ignored.
> +     * </p>
> +     * <p>
> +     * If the array is {@code null}, {@code 0} is returned.
> +     * </p>
> +     *
> +     * @param array the array to convert
> +     * @return the converted value
> +     * @throws IllegalArgumentException if the array has fewer than two
> elements
> +     */
> +    public static short toShort(byte[] array) {
> +        // Match toShort(String)
> +        if (array == null) {
> +            return 0;
> +        }
> +
> +        Validate.isTrue(array.length >= 2, "Byte array length too short: %d",
> array.length);
> +
> +        return (short) (((array[0] & 0xff) << 8) | (array[1] & 0xff));
> +    }
> +
> +    /**
> +     * <p>
> +     * Converts a byte array to an {@code int}.
> +     * </p>
> +     * <p>
> +     * The first four bytes of the
> +     * array are converted from two's complement representation to an {@code
> int}.
> +     * Any additional bytes are ignored.
> +     * </p>
> +     * <p>
> +     * If the array is {@code null}, {@code 0} is returned.
> +     * </p>
> +     *
> +     * @param array the array to convert
> +     * @return the converted value
> +     * @throws IllegalArgumentException if the array has fewer than four
> elements
> +     */
> +    public static int toInt(byte[] array) {
> +        // Match toInt(String)
> +        if (array == null) {
> +            return 0;
> +        }
> +
> +        Validate.isTrue(array.length >= 4, "Byte array length too short: %d",
> array.length);
> +
> +        return ((array[0] & 0xff) << 24) | ((array[1] & 0xff) << 16) |
> +               ((array[2] & 0xff) << 8) | (array[3] & 0xff);
> +    }
> +
> +
> +
> +    /**
> +     * <p>
> +     * Converts a byte array to a {@code long}.
> +     * </p>
> +     * <p>
> +     * The first eight bytes of the
> +     * array are converted from two's complement representation to a {@code
> long}.
> +     * Any additional bytes are ignored.
> +     * </p>
> +     * <p>
> +     * If the array is {@code null}, {@code 0} is returned.
> +     * </p>
> +     *
> +     * @param array the array to convert
> +     * @return the converted value
> +     * @throws IllegalArgumentException if the array has fewer than eight
> elements
> +     */
> +    public static long toLong(byte[] array) {
> +        // Match toLong(String)
> +        if (array == null) {
> +            return 0l;
> +        }
> +
> +        Validate.isTrue(array.length >= 8, "Byte array length too short: %d",
> array.length);
> +
> +        int i1 = ((array[0] & 0xff) << 24) | ((array[1] & 0xff) << 16) |
> +                 ((array[2] & 0xff) << 8) | (array[3] & 0xff);
> +        int i2 = ((array[4] & 0xff) << 24) | ((array[5] & 0xff) << 16) |
> +                 ((array[6] & 0xff) << 8) | (array[7] & 0xff);
> +
> +        return ((i1 & 0xffffffffL) << 32) | (i2 & 0xffffffffL);
> +    }
> +
> +
> +
> +    /**
> +     * <p>
> +     * Converts a byte array to a {@code float}.
> +     * </p>
> +     * <p>
> +     * The first four bytes of the array are converted from IEEE 754
> floating-point
> +     * "single format" bit layout to a {@code float}.
> +     * </p>
> +     * <p>
> +     * If the array is {@code null}, {@code 0} is returned.
> +     * </p>
> +     *
> +     * @param array the array to convert
> +     * @return the converted value
> +     * @throws IllegalArgumentException if the array has fewer than four
> elements
> +     */
> +    public static float toFloat(byte[] array) {
> +        // Match toFloat(String)
> +        if (array == null) {
> +            return 0.0f;
> +        }
> +
> +        Validate.isTrue(array.length >= 4, "Byte array length too short: %d",
> array.length);
> +
> +        return Float.intBitsToFloat(toInt(array));
> +    }
> +
> +    /**
> +     * <p>
> +     * Converts a byte array to a {@code double}.
> +     * </p>
> +     * <p>
> +     * The first eight bytes of the array are converted from IEEE 754
> floating-point
> +     * "double format" bit layout to a {@code double}.
> +     * </p>
> +     * <p>
> +     * If the array is {@code null}, {@code 0} is returned.
> +     * </p>
> +     *
> +     * @param array the array to convert
> +     * @return the converted value
> +     * @throws IllegalArgumentException if the array has fewer than eight
> elements
> +     */
> +    public static double toDouble(byte[] array) {
> +        // Match toDouble(String)
> +        if (array == null) {
> +            return 0.0;
> +        }
> +
> +        Validate.isTrue(array.length >= 8, "Byte array length too short: %d",
> array.length);
> +
> +        return Double.longBitsToDouble(toLong(array));
> +    }
> +
> +
> +    /**
> +     * <p>
> +     * Converts a {@code short} to a two-byte array in two's complement
> format.
> +     * </p>
> +     *
> +     * @param value the value to convert
> +     * @return the byte array
> +     */
> +    public static byte[] toByteArray(short value) {
> +        byte[] buffer = new byte[2];
> +        buffer[0] = (byte) (value >> 8);
> +        buffer[1] = (byte) value;
> +        return buffer;
> +    }
> +
> +    /**
> +     * <p>
> +     * Converts an {@code int} to a four-byte array in two's complement
> format.
> +     * </p>
> +     *
> +     * @param value the value to convert
> +     * @return the byte array
> +     */
> +    public static byte[] toByteArray(int value) {
> +        byte[] buffer = new byte[4];
> +        buffer[0] = (byte) (value >> 24);
> +        buffer[1] = (byte) (value >> 16);
> +        buffer[2] = (byte) (value >> 8);
> +        buffer[3] = (byte) value;
> +        return buffer;
> +    }
> +
> +
> +
> +    /**
> +     * <p>
> +     * Converts a {@code float} to a four-byte array in IEEE 754 floating-
> point
> +     * "single format" bit layout.
> +     * </p>
> +     *
> +     * @param value the value to convert
> +     * @return the byte array
> +     */
> +    public static byte[] toByteArray(float value) {
> +       return toByteArray(Float.floatToIntBits(value));
> +    }
> +
> +    /**
> +     * <p>
> +     * Converts a {@code long} to an eight-byte array in two's complement
> format.
> +     * </p>
> +     *
> +     * @param value the value to convert
> +     * @return the byte array
> +     */
> +    public static byte[] toByteArray(long value) {
> +        byte[] buffer = new byte[8];
> +        buffer[0] = (byte) (value >> 56);
> +        buffer[1] = (byte) (value >> 48);
> +        buffer[2] = (byte) (value >> 40);
> +        buffer[3] = (byte) (value >> 32);
> +        buffer[4] = (byte) (value >> 24);
> +        buffer[5] = (byte) (value >> 16);
> +        buffer[6] = (byte) (value >> 8);
> +        buffer[7] = (byte) value;
> +        return buffer;
> +    }
> +
> +    /**
> +     * <p>
> +     * Converts a {@code double} to an eight-byte array in IEEE 754 floating-
> point
> +     * "double format" bit layout.
> +     * </p>
> +     *
> +     * @param value the value to convert
> +     * @return the byte array
> +     */
> +    public static byte[] toByteArray(double val) {
> +       return toByteArray(Double.doubleToLongBits(val));
> +    }
>  }
>
> Modified:
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
> URL:
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java?rev=1563259&r1=1563258&r2=1563259&view=diff
> ==============================================================================
> ---
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
> (original)
> +++
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java
> Fri Jan 31 21:12:57 2014
> @@ -16,11 +16,7 @@
>   */
>  package org.apache.commons.lang3.math;
>
> -import static org.junit.Assert.assertEquals;
> -import static org.junit.Assert.assertFalse;
> -import static org.junit.Assert.assertNotNull;
> -import static org.junit.Assert.assertTrue;
> -import static org.junit.Assert.fail;
> +import static org.junit.Assert.*;
>
>  import java.lang.reflect.Constructor;
>  import java.lang.reflect.Modifier;
> @@ -57,7 +53,7 @@ public class NumberUtilsTest {
>          assertTrue("toInt(String) 1 failed", NumberUtils.toInt("12345") ==
> 12345);
>          assertTrue("toInt(String) 2 failed", NumberUtils.toInt("abc") == 0);
>          assertTrue("toInt(empty) failed", NumberUtils.toInt("") == 0);
> -        assertTrue("toInt(null) failed", NumberUtils.toInt(null) == 0);
> +        assertTrue("toInt(null) failed", NumberUtils.toInt((String) null) ==
> 0);
>      }
>
>      /**
> @@ -81,7 +77,7 @@ public class NumberUtilsTest {
>          assertTrue("toLong(Long.MAX_VALUE) failed",
> NumberUtils.toLong(Long.MAX_VALUE+"") == Long.MAX_VALUE);
>          assertTrue("toLong(Long.MIN_VALUE) failed",
> NumberUtils.toLong(Long.MIN_VALUE+"") == Long.MIN_VALUE);
>          assertTrue("toLong(empty) failed", NumberUtils.toLong("") == 0l);
> -        assertTrue("toLong(null) failed", NumberUtils.toLong(null) == 0l);
> +        assertTrue("toLong(null) failed", NumberUtils.toLong((String) null)
> == 0l);
>      }
>
>      /**
> @@ -104,7 +100,7 @@ public class NumberUtilsTest {
>          assertTrue("toFloat(Float.MAX_VALUE) failed",
> NumberUtils.toFloat(Float.MAX_VALUE+"") ==  Float.MAX_VALUE);
>          assertTrue("toFloat(Float.MIN_VALUE) failed",
> NumberUtils.toFloat(Float.MIN_VALUE+"") == Float.MIN_VALUE);
>          assertTrue("toFloat(empty) failed", NumberUtils.toFloat("") == 0.0f);
> -        assertTrue("toFloat(null) failed", NumberUtils.toFloat(null) ==
> 0.0f);
> +        assertTrue("toFloat(null) failed", NumberUtils.toFloat((String) null)
> == 0.0f);
>      }
>
>      /**
> @@ -140,7 +136,7 @@ public class NumberUtilsTest {
>          assertTrue("toDouble(Double.MAX_VALUE) failed",
> NumberUtils.toDouble(Double.MAX_VALUE+"") == Double.MAX_VALUE);
>          assertTrue("toDouble(Double.MIN_VALUE) failed",
> NumberUtils.toDouble(Double.MIN_VALUE+"") == Double.MIN_VALUE);
>          assertTrue("toDouble(empty) failed", NumberUtils.toDouble("") ==
> 0.0d);
> -        assertTrue("toDouble(null) failed", NumberUtils.toDouble(null) ==
> 0.0d);
> +        assertTrue("toDouble(null) failed", NumberUtils.toDouble((String)
> null) == 0.0d);
>      }
>
>      /**
> @@ -180,7 +176,7 @@ public class NumberUtilsTest {
>          assertTrue("toShort(String) 1 failed", NumberUtils.toShort("12345")
> == 12345);
>          assertTrue("toShort(String) 2 failed", NumberUtils.toShort("abc") ==
> 0);
>          assertTrue("toShort(empty) failed", NumberUtils.toShort("") == 0);
> -        assertTrue("toShort(null) failed", NumberUtils.toShort(null) == 0);
> +        assertTrue("toShort(null) failed", NumberUtils.toShort((String) null)
> == 0);
>      }
>
>      /**
> @@ -1399,5 +1395,94 @@ public class NumberUtilsTest {
>          final float[] bF = new float[] { Float.NaN, 1.2f, Float.NaN, 3.7f,
> 27.0f, 42.0f, Float.NaN };
>          assertTrue(Float.isNaN(NumberUtils.max(bF)));
>      }
> +
> +    @Test
> +    public void testByteArrayConversionArgChecking() throws Exception {
> +        try {
> +            NumberUtils.toShort(new byte[1]);
> +            fail();
> +        } catch (IllegalArgumentException e) {}
> +
> +        try {
> +            NumberUtils.toInt(new byte[3]);
> +            fail();
> +        } catch (IllegalArgumentException e) {}
> +
> +        try {
> +            NumberUtils.toLong(new byte[7]);
> +            fail();
> +        } catch (IllegalArgumentException e) {}
> +
> +        try {
> +            NumberUtils.toFloat(new byte[3]);
> +            fail();
> +        } catch (IllegalArgumentException e) {}
> +
> +        try {
> +            NumberUtils.toDouble(new byte[7]);
> +            fail();
> +        } catch (IllegalArgumentException e) {}
> +    }
> +
> +
> +    @Test
> +       public void testShortByteArrayConversion() {
> +               // tests symmetry
> +               assertEquals((short) 1,
> NumberUtils.toShort(NumberUtils.toByteArray((short) 1)));
> +
> +               assertEquals(0, NumberUtils.toShort((byte[]) null));
> +               assertArrayEquals(new byte[] {(byte) 0x7F, (byte) 0xFF},
> NumberUtils.toByteArray(Short.MAX_VALUE));
> +               assertArrayEquals(new byte[2], NumberUtils.toByteArray((short) 0));
> +               assertArrayEquals(new byte[] {(byte) 0xFF, (byte) 0xFF},
> NumberUtils.toByteArray((short) -1));
> +               assertArrayEquals(new byte[] {(byte) 0x80, (byte) 0x00},
> NumberUtils.toByteArray(Short.MIN_VALUE));
> +       }
> +
>
> +    @Test
> +       public void testIntByteArrayConversion() {
> +               // tests symmetry
> +               assertEquals(1, NumberUtils.toInt(NumberUtils.toByteArray(1)));
> +
> +               assertEquals(0, NumberUtils.toInt((byte[]) null));
> +        assertArrayEquals(new byte[] {(byte) 0x7F, (byte) 0xFF, (byte) 0xFF,
> (byte) 0xFF},
> +                NumberUtils.toByteArray(Integer.MAX_VALUE));
> +        assertArrayEquals(new byte[4],
> +                NumberUtils.toByteArray(0));
> +        assertArrayEquals(new byte[] {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
> (byte) 0xFF},
> +                NumberUtils.toByteArray(-1));
> +        assertArrayEquals(new byte[] {(byte) 0x80, (byte) 0x00, (byte) 0x00,
> (byte) 0x00},
> +                NumberUtils.toByteArray(Integer.MIN_VALUE));
> +       }
> +
> +    @Test
> +       public void testLongByteArrayConversion() {
> +               // tests symmetry
> +               assertEquals(1l, NumberUtils.toLong(NumberUtils.toByteArray(1l)));
> +
> +               assertEquals(0, NumberUtils.toLong((byte[]) null));
> +        assertArrayEquals(new byte[] {(byte) 0x7F, (byte) 0xFF, (byte) 0xFF,
> (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF},
> +                NumberUtils.toByteArray(Long.MAX_VALUE));
> +        assertArrayEquals(new byte[8],
> +                NumberUtils.toByteArray(0L));
> +        assertArrayEquals(new byte[] {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
> (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF},
> +                NumberUtils.toByteArray(-1L));
> +        assertArrayEquals(new byte[] {(byte) 0x80, (byte) 0x00, (byte) 0x00,
> (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00},
> +                NumberUtils.toByteArray(Long.MIN_VALUE));
> +       }
> +
> +    @Test
> +       public void testDoubleByteArrayConversion() {
> +               // tests symmetry
> +        assertEquals(0, NumberUtils.toDouble((byte[]) null), 0);
> +               assertEquals(0,
> Double.compare(NumberUtils.toDouble(NumberUtils.toByteArray(1.1d)), 1.1d));
> +       }
> +
> +
> +    @Test
> +    public void testFloatByteArrayConversion() {
> +        // tests symmetry
> +        assertEquals(0, NumberUtils.toFloat((byte[]) null), 0);
> +        assertEquals(0,
> Float.compare(NumberUtils.toFloat(NumberUtils.toByteArray(1.1f)), 1.1f));
> +    }
> +
>  }
>
>
>
> --------------- Weitergeleitete Nachricht (Ende)
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: svn commit: r1563259 - in /commons/proper/lang/trunk: pom.xml src/changes/changes.xml src/main/java/org/apache/commons/lang3/math/NumberUtils.java src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java

Posted by Jörg Schaible <jo...@swisspost.com>.
Hi Duncan,

Duncan Jones wrote:

> On 31 January 2014 22:44, Jörg Schaible <jo...@gmx.de> wrote:
>>
>> -1
>>
>> Please revert, we have that already in
>> org.apache.commons.lang3.Conversion
> 
> Thanks for pointing that out. I've reverted.
> 
> I agree it looks like Conversion might be a better place to put the
> functionality. It seems what I've added is equivalent to (the not yet
> implemented) Conversion.intToByteArrayBe(),
> Conversion.byteArrayBeToInt() and so on. So perhaps to close LANG-341,
> those methods will need to be implemented.

Fine with me.

> 
> Any thoughts on the double/float methods included in LANG-341? I
> wasn't 100% sure of those anyway, but they didn't hurt when being
> added to NumberUtils. Is there a place for those in Conversion?

IMHO, yes. Conversion was all about converting types to bytes and vice 
versa.

- Jörg


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org