使用Java从HDF5文件中的NetCDF char数组变量中检索1D数组

时间:2013-05-01 22:41:26

标签: java string char hdf5 netcdf

使用Java API for NetCDF,我有一个类型为CHAR的数组的HDF5文件,根据documentation类似于只包含ASCII字符的字符串:“char类型包含未解释的字符,一个字符每个字节。通常这些包含7位ASCII字符。“在HDFView中,数组中其中一个值的示例是“13”。

我知道对于一个整数数组,我可以将它们全部作为Java数组得到:

int[] data = (int[]) netCDFArray.get1DJavaArray(int.class);

但是如何取回这种CHAR类型的数组呢?不幸的是,我引用的文档没有任何帮助。

以下内容不正确,因为有些项目不止是单个字符:

char[] data = (char[]) netCDFArray.get1DJavaArray(char.class);

以下尝试全部抛出ForbiddenConversionException

char[] data = (char[]) netCDFArray.get1DJavaArray(char.class);
char[][] data = (char[][]) netCDFArray.get1DJavaArray(char[].class);
String[] data = (String[]) netCDFArray.get1DJavaArray(String.class);

如果我使用netCDFArray.toString(),我会看到我的字符串数组,因为ArrayChar使用了StringIterator。我想也可以使用这样的迭代器并对每个字符串做一些事情。但是我不需要获取int迭代器来检索整数。如何一次性有效地检索CHAR类型的所有字符串,类似于我如何检索整数(见上文)?我会满足于检索Java Strings[]CharSequence[]char[][]

1 个答案:

答案 0 :(得分:0)

似乎CHAR类型的NetCDF字符串在逻辑上表示为类型char的二维数组,但在内部它被存储为类型char的单个数组。因此,检索数据的最有效方法如下:

char[] data = (char[]) netCDFArray.get1DJavaArray(char.class);

然后必须从这个单个数组中提取单个字符串:

assert netCDFArray.getRank()==2 : "Expected a two-dimensional logical array of chars.";
int stringLength=netCDFArray.getShape()[1];
int stringCount=netCDFArray.getShape()[0];
//iterate through stringCount positions of stringLength length

增加的扭曲是显然字符串存储为零终止,也就是说,所谓的固定长度字符串显然可能是使用ASCII 0作为分隔符的小于 stringLength 的可变长度字符串。我从代码中得到了这个;我在documentation中找不到它。