NetCDF-Java:如何写无符号属性?

时间:2013-06-17 01:39:29

标签: netcdf

我尝试使用NetCDF-Java 4.3将无符号值写入nc4文件中的valid_range属性,但它始终写为已签名。这使得查看应用程序错误地显示数据。示例代码:

Array array = Array.factory(DataType.byte, new int[] { 2 });
array.setUnsigned(true);
array.setObject(0, 0);
array.setObject(1, 255);
Attribute attr = new Attribute("valid_range", array);
log.debug("{}", attr);

打印出来:

valid_range = 0UB, -1UB

但结果文件中该属性的CDL是:

colour1:valid_range = 0b, -1b ;

当我在ToolsUI 4.3中查看该变量时,它全部为空,因为所有内容都在假范围之外。我尝试使用short来表示无符号字节;适用于valid_range,但_FillValue属性失败:

WARN  Nc4Iosp - _FillValue type must agree with var = colour2 type short!=byte

如何将无符号类型写入属性?

2 个答案:

答案 0 :(得分:3)

  1. Netcdf-Java稳定版本是4.6,而4.3已经过时了,特别是写入netcdf4。所以你应该看看4.6是如何工作的。

  2. Netcdf-Java第5版添加了无符号数据类型,以便更轻松,但这还不稳定。

  3. 扩展valid_range是一个很好的解决方案。正如您所指出的那样,您必须将_FillValue保留为与变量相同的类型。

  4. 为什么要设置valid_range? IMO,这不是一个好的做法,因为它迫使客户端软件检查有效性。除非你真的需要它,否则不要使用它。记录actual_range更有用。

答案 1 :(得分:1)

如果变量是无符号的,则应扩展valid_range值并将其存储为无符号整数。

Array array = Array.factory(DataType.byte, new int[] { 2 });

将其更改为......

Array array = Array.factory(DataType.INT, new int[] { 2 });

这来自Unidata的网站。

https://www.unidata.ucar.edu/software/netcdf/docs/BestPractices.html