gpt4 book ai didi

c - HDF5 属性 unsigned long long 值

转载 作者:行者123 更新时间:2023-11-30 15:26:57 26 4
gpt4 key购买 nike

当我尝试向数据集中添加 unsigned long long 属性时,会添加该属性,但不会添加值。对整数使用类似的方法似乎可以工作文件。

我使用 HDF View 来查看属性。显示属性名称,但对于 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文件时,“IntAttribute”和“LongAttribute”属性均可见,但LongAttribute没有值。

Intel 64 上的 HFView 2.9、Fedora 20。

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

写: 按照同样的思路,你为什么要为属性编写一个数组?我编辑了一个示例,它在数组中存储了 2 个值。我从你的例子中看到,你已经对空间进行了 malloc() 处理,从现在开始我将使用它,因为它看起来更清楚。

写: 您使用的是 Intel 64,但您想编写大端字节序吗?是的:这仍然让我困惑:H5T_STD_I32BE 和 H5T_STD_I32LE 都成功工作,但 H5T_STD_U64BE 和 H5T_STD_U64LE 在 HDFView 中都没有显示值。我猜想 HDF5 库中的某个地方会检查大端和小端,并相应地处理该值,而不管参数如何。稍后我会尽量避免使用 Postgresql 二进制数来绊倒这个“功能”,这些二进制数始终是大端值。

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

我正在使用适用于 Linux 的 HDFView 2.9。正如 Timothy 提到的,这在 HDFView 2.10 中有效,同时我将使用 h5dump。

最佳答案

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

  1. 您为什么要为属性创建一个简单的数据空间?
  2. 同样的代码,你为什么要为属性编写一个数组?
  3. 您使用的是 Intel 64,但您想编写大端字节序吗?

这是使用标量数据空间编写属性的简单示例:

#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

您能确认/重现您的错误吗?

关于c - HDF5 属性 unsigned long long 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27243947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com