Hi guys -
We have been collaborating for awhile now on various projects with
developers
from the Indian Space Research Organization (ISRO). One of their guys,
Ghansham
Sangar, reported what looks like a bug in some static utilities in
DataUtil. After
looking them over, I concur.
It looks like the utilities toFloatarray(Array a) and
toDoubleArray(Array a) are
not handling unsigned data. Since Java never had support for unsigned
byte,
etc. types, you always have to do a little futzing when converting
unsigned values.
As an example, here is how I would modify the current toFloatArray() method.
Please look into getting this change in the library and let me know if
you need
more info. Thanks Julien and Yuan!
/**
* Get the 1D values for an array as floats.
*
* @param arr Array of values
* @return float representation
*/
public static float[] toFloatArray(Array arr) {
Object dst = arr.get1DJavaArray(float.class);
Class fromClass = dst.getClass().getComponentType();
if (fromClass.equals(float.class)) {
//It should always be a float
return (float[]) dst;
} else {
float[] values = new float[(int) arr.getSize()];
boolean isUnsigned = arr.isUnsigned();
if (fromClass.equals(byte.class)) {
byte[] fromArray = (byte[]) dst;
for (int i = 0; i < fromArray.length; ++i) {
if (isUnsigned) {
values[i] = (int) fromArray[i] & 0xFF;
} else {
values[i] = fromArray[i];
}
}
} else if (fromClass.equals(short.class)) {
short[] fromArray = (short[]) dst;
for (int i = 0; i < fromArray.length; ++i) {
if (isUnsigned) {
values[i] = (int) fromArray[i] & 0xFFFF;
} else {
values[i] = fromArray[i];
}
}
} else if (fromClass.equals(int.class)) {
int[] fromArray = (int[]) dst;
for (int i = 0; i < fromArray.length; ++i) {
if (isUnsigned) {
values[i] = (long) fromArray[i] & 0xFFFFFFFF;
} else {
values[i] = fromArray[i];
}
}
} else if (fromClass.equals(double.class)) {
double[] fromArray = (double[]) dst;
for (int i = 0; i < fromArray.length; ++i) {
values[i] = (float) fromArray[i];
}
} else {
throw new IllegalArgumentException("Unknown array type:"
+ fromClass.getName());
}
return values;
}
}
--
Tommy Jasmin
Space Science and Engineering Center
University of Wisconsin, Madison
1225 West Dayton Street, Madison, WI 53706