确定NetCDF中HDF5变量的签名状态

时间:2013-04-30 22:29:00

标签: unsigned hdf5 netcdf

我的团队已获得HDF5文件阅读。它们包含带有无符号变量的结构化数据。我和我的团队非常高兴找到NetCDF库,它允许纯Java读取HDF5文件,尽管使用的是NetCDF数据模型。

没问题---我们认为我们只是将NetCDF数据模型转换为我们想要的任何模型。只要我们得到数据。然后我们尝试从HDF5文件中读取无符号的32位整数。我们可以加载HDFView 2.9并看到变量是无符号的32位整数。但是......结果是NetCDF-3 doesn't support unsigned values

为了增加对伤害的侮辱,NetCDF-3建议您“扩大数据类型”或使用_Unsigned = "true"属性(我不是这样做)来指示32位应该被视为无符号值。

好吧,如果从头开始创建NetCDF数据,那些kludges可能会有效,但如何使用NetCDF检测现有HDF5文件中的32位值是否应该被解释为无符号?

更新:显然是NetCDF-4 does support unsigned data types。所以这就引出了一个问题:如何确定某个值是否已从NetCDF Java库中签名或取消签名?“我在ucar.ma2.DataType中看不到任何无符号类型。

3 个答案:

答案 0 :(得分:3)

是的,您可以查找_Unsigned =“true”属性,也可以调用Variable.isUnsigned()。

因为Java不支持无符号类型,所以这是一个困难的设计决策。最终我们决定不自动扩大类型,以提高效率。所以应用程序必须检查并做正确的事情。查看ucar.nc2.DataType.unsignedXXX()辅助方法。

当您读取数据时,您将获得一个Array对象。你可以调用Array.isUnsigned()。像Array.getDouble()这样的提取器也会正确转换。

netCDF-Java库支持称为“公共数据模型”的扩展数据模型,以抽象出文件格式的差异。因此,我们不会受到netCDF-3文件格式或数据模型的限制。但我们在Java

约翰

答案 1 :(得分:1)

鉴于Java没有无符号类型的事实,我认为唯一的选择是1)自动加宽无符号数据(将字节变为短路,短路为ins,ints为long),或2)表示有符号和无符号整数使用可用的Java数据类型,让用户决定是否/何时应该扩展它。

可以说无符号数据的主要用途是表示位,在这种情况下,转换将是一种浪费,因为您只需屏蔽并测试这些位。

另一个主要用途是用于通常使用无符号字节的卫星数据,而且我认为不会自动加宽是正确的选择。你最终做的只是在你使用它的时候扩大。

答案 2 :(得分:0)

似乎在CDM data types are mapped to Java时,NetCDF会自动将属性_Unsigned = "true"添加到变量中。所以我假设如果我检查该属性,它将指示该值是否是无符号的。这可能正是我所寻找的;我明天会确认它有效。

更新:我试过这个并且它有效;此外,正如John Caron在接受的答案中指出的那样,NetCDF数组有一个isUnsigned()方法,用于检查_Unsigned属性。