Когда я пытаюсь добавить беззнаковый длинный атрибут к набору данных, атрибут добавляется, но не значение. Использование похожего метода для целого числа, похоже, работает с файлом.HDF5 Атрибут unsigned long long value
Использование HDF для просмотра атрибутов. Отображаются имена атрибутов, но и для беззнаковых длинных длинных атрибутов, значения не видны
Код выглядит следующим образом:
herr_t Result;
//Open the file
hid_t DataFile = H5Fopen(FileName, H5F_ACC_RDWR, H5P_DEFAULT);
//Open the dataset
hid_t DataSet = H5Dopen2(DataFile, "/Summary", H5P_DEFAULT);
//Create the data space for the attribute.
hsize_t AttributeDims = 1;
hid_t AttributeDataSpace = H5Screate_simple(1, &AttributeDims , NULL);
hid_t Attribute;
//Attribute 1: Fail to write a long long attribute
Attribute = H5Acreate2 (DataSet, "LongAttribute", H5T_STD_U64BE, AttributeDataSpace, H5P_DEFAULT, H5P_DEFAULT);
if (Attribute < 0) {
fprintf(stdout, "Failed to add the unsigned long long attribute to the file %s.", FileName);
return false;
}
//Write the attribute data
unsigned long long* ULLAttribute = (unsigned long long*) malloc(sizeof(unsigned long long) * 1);
ULLAttribute[0] = (unsigned long long) 4;
Result = H5Awrite(Attribute, H5T_NATIVE_ULLONG, ULLAttribute);
if (Result < 0) {
fprintf(stdout, "Failed to write the unsigned long long attribute to the file %s.", FileName);
return false;
}
//Attribute 2: Succesfully Write a integer attribute
Attribute = H5Acreate2 (DataSet, "IntAttribute", H5T_STD_I32BE, AttributeDataSpace, H5P_DEFAULT, H5P_DEFAULT);
if (Attribute < 0) {
fprintf(stdout, "Failed to create the attribute for the file %s.", FileName);
return false;
}
//Write the attribute data
int32_t* IAttribute = (int32_t*) malloc(sizeof(int32_t) * 1);
IAttribute[0] = (int32_t) 4;
Result = H5Awrite(Attribute, H5T_NATIVE_INT, IAttribute);
if (Result < 0) {
fprintf(stdout, "Failed to add the integer attribute to the file %s.", FileName);
return false;
}
//Close the attribute, Dataset and DataFile
Result = H5Aclose(Attribute);
Result = H5Dclose(DataSet);
Result = H5Fclose(DataFile);
Нет сообщений об ошибках не отображаются, когда код выполняется, но когда Файл HDF5 просматривается, оба атрибута, «IntAttribute» и «LongAttribute» видны, но LongAttribute не имеет значения.
HFView 2,9, Fedora 20 на разведданные 64.
Picking некоторых Вопрос Тимоти в WRT: Каким образом вы создаете простой DataSpace для атрибута? Я жуял сохранение параметров модели в качестве атрибутов, подобных парам ключ-значение. Многие параметры модели являются простыми скалярными значениями.
Wrt: Следуя тем же строкам, как вы написали массив для атрибута? Я редактировал пример, в котором хранилось 2 значения в массиве. Я вижу из вашего примера, у вас есть malloc() 'пространство, которое я буду использовать с этого момента, поскольку кажется более понятным.
Wrt: Ваш на Intel 64, но вы хотите написать большой эндиан? Да: это все еще озадачивает меня: оба H5T_STD_I32BE и H5T_STD_I32LE работают успешно, но ни H5T_STD_U64BE, ни H5T_STD_U64LE не показывают значение в HDFView. Я предполагаю, что где-то в библиотеке HDF5 он проверяет большой и малозначимый и обрабатывает значение, независимо от параметра. Я постараюсь не переходить через эту «функцию» позже с двоичными числами Postgresql, которые всегда являются большими значениями по умолчанию.
Проблема, как представляется, в HDFView, который до сих пор не отображаются без знака долго долго в файле ull.h5 создаваемого кода Тимофея, или из моего кода:
Я использую HDFView 2,9 для Linux , Поскольку Тимоти упомянул об этом, в HDFView 2.10 я буду использовать h5dump тем временем.
Интересно, что HDFView 2.9 не отображает его. Postgresql передает только цифры в формате big endian (так называемый сетевой байтовый порядок). При разговоре с Postgresql вы действительно должны использовать 'xdr()', 'ntohl()' и друзей. Чтобы абстрагироваться от того, что вашему приложению не нужно знать, на каком endian он работает. Удачи! –