2014-12-02 6 views
0

Когда я пытаюсь добавить беззнаковый длинный атрибут к набору данных, атрибут добавляется, но не значение. Использование похожего метода для целого числа, похоже, работает с файлом.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 создаваемого кода Тимофея, или из моего кода: enter image description here

Я использую HDFView 2,9 для Linux , Поскольку Тимоти упомянул об этом, в HDFView 2.10 я буду использовать h5dump тем временем.

+0

Интересно, что HDFView 2.9 не отображает его. Postgresql передает только цифры в формате big endian (так называемый сетевой байтовый порядок). При разговоре с Postgresql вы действительно должны использовать 'xdr()', 'ntohl()' и друзей. Чтобы абстрагироваться от того, что вашему приложению не нужно знать, на каком endian он работает. Удачи! –

ответ

1

Несколько вопросов, которые должны быть прекрасными, но мне просто интересно.

  1. Почему вы создаете простую атрибуту атрибута?
  2. Следуя тем же строкам, как вы написали массив для атрибута?
  3. Ваш на Intel 64, но вы хотите написать большой эндиан?

Вот простой пример написания атрибута с помощью скалярного DataSpace:

#include <stdio.h> 
#include <stdlib.h> 
#include <hdf5.h> 

int 
main(int argc, char **argv) 
{ 
     unsigned long long *ull = NULL; 
     hid_t f_id = {0}; 
     hid_t d_id = {0}; 
     hid_t s_id = {0}; 
     hid_t a_id = {0}; 
     hid_t as_id = {0}; 
     hsize_t dims[2] = {2, 2}; 
     herr_t status = {0}; 

     f_id = H5Fcreate("ull.h5",H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); 
     s_id = H5Screate_simple(2, dims, NULL); 
     d_id = H5Dcreate(f_id, "/data", H5T_STD_I32BE, s_id, 
         H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); 

     as_id = H5Screate(H5S_SCALAR); 
     a_id = H5Acreate(d_id, "unsigned long long", H5T_STD_U64LE, 
         as_id, H5P_DEFAULT, H5P_DEFAULT); 

     ull = malloc(sizeof(unsigned long long)); 
     *ull = 123; 
     status = H5Awrite(a_id, H5T_NATIVE_ULLONG, ull); 

     status = H5Aclose(a_id); 
     status = H5Dclose(d_id); 
     status = H5Sclose(s_id); 
     status = H5Fclose(f_id); 

     return(EXIT_SUCCESS); 
} 

После компиляции и запуска:

h5pcc -o test test.c && ./test && h5dump ull.h5 

Я вижу это прекрасно:

HDF5 "ull.h5" { 
GROUP "/" { 
    DATASET "data" { 
     DATATYPE H5T_STD_I32BE 
     DATASPACE SIMPLE { (2, 2)/(2, 2) } 
     DATA { 
     (0,0): 0, 0, 
     (1,0): 0, 0 
     } 
     ATTRIBUTE "unsigned long long" { 
     DATATYPE H5T_STD_U64LE 
     DATASPACE SCALAR 
     DATA { 
     (0): 1234 
     } 
     } 
    } 
} 
} 

Конечно, если я изменил скалярный атрибут dataspace на простой d ataspace он все еще работает:

as_id = H5Screate_simple(1, adims, NULL); 
a_id = H5Acreate(d_id, "unsigned long long", H5T_STD_U64LE, 
       as_id, H5P_DEFAULT, H5P_DEFAULT); 
ull = malloc(sizeof(unsigned long long)); 
*ull = 123; 

Получает:

ATTRIBUTE "unsigned long long" { 
    DATATYPE H5T_STD_U64LE 
    DATASPACE SIMPLE { (1)/(1) } 
    DATA { 
    (0): 123 
    } 

Прямо так после долгой намотанного примера того, как это может быть сделано. Глядя на ваш код, я действительно не могу найти вашу ошибку. На самом деле, используя код, как на пустой файл HDF5 работы:

localhost ~$ h5dump ull.h5 
HDF5 "ull.h5" { 
GROUP "/" { 
    DATASET "Summary" { 
     DATATYPE H5T_STD_I32BE 
     DATASPACE SIMPLE { (2, 2)/(2, 2) } 
     DATA { 
     (0,0): 0, 0, 
     (1,0): 0, 0 
     } 
    } 
} 
} 
localhost ~$ ./foo 
localhost ~$ h5dump ull.h5 
HDF5 "ull.h5" { 
GROUP "/" { 
    DATASET "Summary" { 
     DATATYPE H5T_STD_I32BE 
     DATASPACE SIMPLE { (2, 2)/(2, 2) } 
     DATA { 
     (0,0): 0, 0, 
     (1,0): 0, 0 
     } 
     ATTRIBUTE "IntAttribute" { 
     DATATYPE H5T_STD_I32BE 
     DATASPACE SIMPLE { (1)/(1) } 
     DATA { 
     (0): 4 
     } 
     } 
     ATTRIBUTE "LongAttribute" { 
     DATATYPE H5T_STD_U64BE 
     DATASPACE SIMPLE { (1)/(1) } 
     DATA { 
     (0): 4 
     } 
     } 
    } 
} 
} 

Вы можете проверить (и после), что h5dump дает вам? Может быть, это просто проблема с использованием HDFView?


Update

Я просто имел взгляд на файл с HDFView (версия 2.10), и это, кажется, хорошо. HDFView inspection of Attributes

Можете ли вы подтвердить/воссоздать свою ошибку?

+0

Спасибо за указание h5dump: это показывает значение, правильно записанное в файл, как вы заметили. Вы решили мою проблему: спасибо. – myk

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