/** * Find whether the underlying data should be interpreted as unsigned. * Only affects byte, short, int, and long. * When true, conversions to wider types are handled correctly. * * @return true if the data is an unsigned integer type. */ public boolean isUnsigned() { return dataType.isUnsigned(); }
/** * Make an 1D array from a list of strings. * * @param dtype data type of the array. * @param stringValues list of strings. * @return resulting 1D array. * @throws NumberFormatException if string values not parseable to specified data type */ static public Array makeArray(DataType dtype, List<String> stringValues) throws NumberFormatException { Array result = Array.factory(dtype, new int[]{stringValues.size()}); IndexIterator dataI = result.getIndexIterator(); for (String s : stringValues) { if (dtype == DataType.STRING) { dataI.setObjectNext(s); } else if (dtype == DataType.LONG) { if (dtype.isUnsigned()) { BigInteger biggy = new BigInteger(s); dataI.setLongNext(biggy.longValue()); // > 63 bits will become "negetive". } else { long val = Long.parseLong(s); dataI.setLongNext(val); } } else { // this works for other numerics (LOOK not unsigned) double val = Double.parseDouble(s); dataI.setDoubleNext(val); } } return result; }
case BYTE: case ENUM1: data = new ArrayByte.D0(dtype.isUnsigned()); data.setByte(0, val.byteValue()); break; case USHORT: case ENUM2: data = new ArrayShort.D0(dtype.isUnsigned()); data.setShort(0, val.shortValue()); break; case UINT: case ENUM4: data = new ArrayInt.D0(dtype.isUnsigned()); data.setInt(0, val.intValue()); break; case LONG: case ULONG: data = new ArrayLong.D0(dtype.isUnsigned()); data.setDouble(0, val.longValue()); break;
if (isUnsignedSet && dtype.isIntegral() && !dtype.isUnsigned()) { dtype = dtype.withSignedness(DataType.Signedness.UNSIGNED);
private void processVariable(Variable v, Array mdata, Counter count) throws IOException { String name = v.getShortName(); String units = v.getUnitsString(); Attribute bwAtt = v.findAttribute("BUFR:bitWidth"); int bitWidth = bwAtt == null ? 0 : bwAtt.getNumericValue().intValue(); if (showData) out.format("%svar='%s' units='%s' : ", indent, name, units); mdata.resetLocalIterator(); while (mdata.hasNext()) { count.nvals++; if (v.getDataType().isUnsigned()) { if (isMissingUnsigned(v, mdata, bitWidth)) count.nmiss++; } else { if (isMissing(v, mdata, bitWidth)) count.nmiss++; } } if (showData) out.format("%n"); }
case UINT: case INT: return ArrayInt.factory(index, dtype.isUnsigned(), (int[]) storage); case ENUM2: case USHORT: case SHORT: return ArrayShort.factory(index, dtype.isUnsigned(), (short[]) storage); case ENUM1: case UBYTE: case BYTE: return ArrayByte.factory(index, dtype.isUnsigned(), (byte[]) storage); case ULONG: case LONG: return ArrayLong.factory(index, dtype.isUnsigned(), (long[]) storage);
if (dataType.isUnsigned()) { if (dataType.isUnsigned()) { f.format("U");
private Attribute convertAttribute(Attribute org) { if (version.isExtendedModel()) return org; if (!org.getDataType().isUnsigned()) return org; Array orgValues = org.getValues(); Array nc3Values = Array.makeFromJavaArray(orgValues.getStorage(), false); return new Attribute(org.getShortName(), nc3Values); }
double dval = v.getDataType().isUnsigned() ? (double) DataType.unsignedByteToShort(bval) : (double) bval;
@Override public Array getArray(StructureMembers.Member m) { VinfoField f = (VinfoField) m.getDataObject(); if (m.getDataType() == DataType.STRING) { String result = matcher.group(f.fldno); return Array.factory(DataType.STRING, new int[] {}, new Object[] {result.trim()}); } else if (m.getDataType() == DataType.SEQUENCE) { return getArraySequence(m); } else if (!m.isScalar()) { if (m.getDataType() == DataType.FLOAT) { float[] ja = getJavaArrayFloat(m); return Array.factory(DataType.FLOAT, m.getShape(), ja); } else if (m.getDataType() == DataType.CHAR) { char[] ja = getJavaArrayChar(m); return Array.factory(DataType.CHAR, m.getShape(), ja); } else if (m.getDataType() == DataType.BYTE) { byte[] ja = getJavaArrayByte(m); return Array.factory(DataType.BYTE, m.getShape(), ja); } } Object result = parse(m.getDataType(), f); if (m.getDataType() == DataType.CHAR) return new ArrayChar((String) result); else return new ArrayScalar(result, m.getDataType().isUnsigned()); }
@Override public Array getArray(StructureMembers.Member m) { TableParser.Field f = (TableParser.Field) m.getDataObject(); if (m.getDataType() == DataType.STRING) { String result = (String) f.parse(line); return Array.factory(DataType.STRING, new int[] {}, new Object[] {result.trim()}); } else if (m.getDataType() == DataType.SEQUENCE) { return getArraySequence(m); } else if (!m.isScalar()) { if (m.getDataType() == DataType.FLOAT) { float[] ja = getJavaArrayFloat(m); return Array.factory(DataType.FLOAT, m.getShape(), ja); } else if (m.getDataType() == DataType.CHAR) { char[] ja = getJavaArrayChar(m); return Array.factory(DataType.CHAR, m.getShape(), ja); } else if (m.getDataType() == DataType.BYTE) { byte[] ja = getJavaArrayByte(m); return Array.factory(DataType.BYTE, m.getShape(), ja); } } Object result = f.parse(line); if (m.getDataType() == DataType.CHAR) return new ArrayChar((String) result); else return new ArrayScalar(result, m.getDataType().isUnsigned()); }
@Test public void testSigned() throws IOException { try (NetcdfFile ncfile = NetcdfDataset.openDataset(TestDir.cdmLocalTestDataDir + "testWrite.nc")) { Variable v = ncfile.findVariable("bvar"); Assert.assertNotNull(v); Assert.assertTrue(!v.getDataType().isUnsigned()); Assert.assertEquals(DataType.BYTE, v.getDataType()); boolean hasSigned = false; Array data = v.read(); while (data.hasNext()) { byte b = data.nextByte(); if (b < 0) hasSigned = true; } assert hasSigned; } }