HDF5属性unsigned long long值

时间:2014-12-02 07:25:21

标签: c hdf5

当我尝试将无符号long long属性添加到数据集时,会添加该属性,但不会添加该值。对整数使用类似的方法似乎工作文件。

使用HDF视图查看属性。将显示属性名称,但对于unsigned long long属性,值不可见

代码如下:

    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文件时,两个属性都会显示&#34; IntAttribute&#34;和#34; LongAttribute&#34;是可见的,但LongAttribute没有价值。

HFView 2.9,英特尔64上的Fedora 20。

挑选蒂莫西的一些问题 WRT:     你为什么要为属性创建一个简单的数据空间? 我正在咀嚼将模型参数存储为属性,有点像键值对。许多模型参数都是简单的标量值。

WRT:     按照相同的路线,你怎么写属性的数组? 我编辑了一个示例,它在数组中存储了2个值。我从你的例子中看到,你是malloc()的空间,从现在开始我将使用它,因为它似乎更清晰。

WRT:     你在英特尔64上,但你想写大端? 是的:这仍然让我感到困惑:H5T_STD_I32BE和H5T_STD_I32LE都成功运行,但H5T_STD_U64BE和H5T_STD_U64LE都没有在HDFView中显示值。我猜想在HDF5库的某个地方,无论参数如何,它都会检查大端与小端并相应地处理该值。我会尽量不去绊倒这个&#34;功能&#34;后来使用Postgresql二进制数,它们总是大端值。

问题似乎出现在HDFView中,它仍然没有在Timothy的代码生成的ull.h5文件中显示unsigned long long,或者从我的代码中显示:enter image description here

我正在使用HDFView 2.9 for Linux。正如蒂莫西提到的那样,在HDFView 2.10中我可以使用h5dump。

1 个答案:

答案 0 :(得分:1)

有几个问题,应该没问题,但我只是好奇。

  1. 为什么要为属性创建简单的数据空间?
  2. 按照相同的路线,你怎么写属性的数组?
  3. 你在英特尔64上,但你想写大端?
  4. 这是使用标量数据空间编写属性的简单示例:

    #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
             }
          }
       }
    }
    }
    

    当然,如果我将标量属性数据空间更改为一个简单的数据空间,它仍然可以工作:

    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

    的问题

    <强>更新

    我刚看了HDFView(版本2.10)的文件,看起来没问题。 HDFView inspection of Attributes

    您可以确认/重新创建错误吗?