我的团队已经获得了HDF5文件可阅读的权限。它们包含带有无符号变量的结构化数据。我和我的团队非常高兴地找到了NetCDF库,它允许纯Java读取HDF5文件,尽管使用了NetCDF数据模型。
没问题--我们以为我们应该把NetCDF数据模型转换成我们想要的任何模型。只要我们把数据拿出来。然后我们尝试从HDF5文件中读取一个无符号的32位整数。我们可以加载HDFView 2.9并看到变量是一个无符号的32位整数。但是..。原来是不支持无符号值!
为了使伤害雪上加霜,NetCDF-3建议您“扩大数据类型”或使用_Unsigned = "true"属性(我不是在捏造这个属性)来指示这32位应该被视为一个无符号值。
好吧,如果我从头开始创建NetCDF数据,这些知识可能是有效的,但是如何使用NetCDF检测到现有HDF5文件中的32位值应该被解释为无符号?。
更新:显然是NetCDF 4确实支持无符号数据类型。。因此,这就引出了一个问题:如何确定一个值是从NetCDF Java库中签名的还是未签名的?“,我在ucar.ma2.DataType中没有看到任何无符号类型。
发布于 2013-05-01 14:05:45
是的,您可以查找_Unsigned = "true“属性,也可以调用Variable.isUnsigned()。
因为Java不支持无符号类型,这是一个困难的设计决策。最后,为了提高效率,我们决定不自动扩大类型。因此,应用程序必须检查并执行正确的操作。查看ucar.nc2.DataType.unsignedXXX()助手方法。
当您读取数据时,您将得到一个Array对象。您可以调用Array.isUnsigned()。此外,像Array.getDouble()这样的提取器将正确地转换。
netCDF库支持一个名为“公共数据模型”的扩展数据模型,以抽象出文件格式的差异。因此,我们并不局限于netCDF 3文件格式或数据模型的限制。但我们在爪哇
约翰
发布于 2013-05-01 18:34:35
考虑到Java没有无符号类型,我认为唯一的选择是: 1)自动扩大无符号数据(将字节转换为空号,将空号转换为ins,或者2)用可用的Java数据类型表示有符号整数和无符号整数,并让用户决定是否/何时应将其加宽。
可以说,无符号数据的主要用途是表示位,在这种情况下,转换将是一种浪费,因为您只需要掩码和测试比特。
另一个主要用途是卫星数据,它经常使用无符号字节,我认为不自动扩大是正确的选择。你最终所做的只是在你使用它的时候扩大范围。
发布于 2013-04-30 23:27:06
似乎当CDM 数据类型映射到Java时,NetCDF将自动向变量添加属性_Unsigned = "true"。因此,假设如果我检查该属性,它将指示该值是否为无符号。这可能正是我所要找的;我明天将核实它是否有效。
Update:我尝试了这个方法,它可以工作;而且,正如John在接受的答案中所指出的,NetCDF数组有一个isUnsigned()方法来检查_Unsigned属性。
https://stackoverflow.com/questions/16309991
复制相似问题