2

我的团队已获得 HDF5 文件可供阅读。它们包含带有无符号变量的结构化数据。我和我的团队欣喜若狂地找到了 NetCDF 库,它允许纯 Java 读取 HDF5 文件,尽管使用的是 NetCDF 数据模型。

没问题——我们认为我们只需从 NetCDF 数据模型转换为我们想要的任何模型。只要我们把数据拿出来。然后我们尝试从 HDF5 文件中读取一个无符号的 32 位整数。我们可以加载 HDFView 2.9 并看到该变量是一个无符号的 32 位整数。但是......事实证明,NetCDF-3 不支持无符号值

雪上加霜,NetCDF-3 建议您“扩大数据类型”或使用_Unsigned = "true"属性(我不是在编造这个)来指示应将 32 位视为无符号值。

好吧,如果我从头开始创建 NetCDF 数据,也许这些组合会很有效,但是我如何使用 NetCDF 检测现有 HDF5 文件中的 32 位值应该被解释为无符号?

更新:显然NetCDF-4 确实支持无符号数据类型。所以这就引出了一个问题:如何确定 NetCDF Java 库中的值是有符号还是无符号?”我在ucar.ma2.DataType.

4

3 回答 3

3

是的,您可以查找 _Unsigned = "true" 属性,或者您可以调用 Variable.isUnsigned()。

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

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

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

约翰

于 2013-05-01T14:05:45.427 回答
1

鉴于 Java 没有无符号类型这一事实,我认为唯一的选择是 1)自动扩展无符号数据(将字节转换为 short,将 short 转换为 ins,将 int 转换为 long),或 2)用可用的方式表示有符号和无符号整数Java 数据类型,并让用户决定是否/何时应该扩大它。

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

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

于 2013-05-01T18:34:35.200 回答
0

似乎当 CDM数据类型映射到 Java时,NetCDF 会自动将属性添加_Unsigned = "true"到变量中。所以我假设如果我检查该属性,它将指示该值是否是无符号的。这可能正是我想要的;明天我会验证它是否有效。

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

于 2013-04-30T23:27:06.517 回答