2013-05-01 3 views
0

Использование Java API для NetCDF У меня есть файл HDF5 с массивом типа CHAR, который согласно documentation похож на строки, содержащие только символы ASCII: Тип char содержит неинтерпретированные символы, по одному символу на каждый байт. Обычно они содержат 7-битные символы ASCII. " В HDFView примером одного из значений the в массиве является «13».Извлечение массивов 1D из переменных массива NetCDF char в файлах HDF5 с использованием Java

Я знаю, что для массива целых чисел я могу получить их все как массив 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[][].

ответ

0

Похоже, что строка NetCDF типа CHAR логически представлена ​​в виде двумерного массива типа 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 

Добавленная поворот является то, что по-видимому строки хранятся в виде нулевое завершение, то есть предположительно строки фиксированной длины, по-видимому, могут быть строками переменной длины менее stringLength с использованием ASCII 0 в качестве разделителя. Я получил это из кода; Я не мог найти его в documentation.

 Смежные вопросы

  • Нет связанных вопросов^_^