我尝试使用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
如何将无符号类型写入属性?
答案 0 :(得分:3)
Netcdf-Java稳定版本是4.6,而4.3已经过时了,特别是写入netcdf4。所以你应该看看4.6是如何工作的。
Netcdf-Java第5版添加了无符号数据类型,以便更轻松,但这还不稳定。
扩展valid_range是一个很好的解决方案。正如您所指出的那样,您必须将_FillValue保留为与变量相同的类型。
为什么要设置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