【发布时间】:2015-01-30 09:02:18
【问题描述】:
当我尝试将 unsigned 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文件时,属性“IntAttribute”和“LongAttribute”都可见,但LongAttribute没有值。
HFView 2.9,Fedora 20 on intel 64。
挑选一些蒂莫西的问题 写: 你为什么要为属性创建一个简单的数据空间? 我正在咀嚼将模型参数存储为属性,有点像键值对。许多模型参数都是简单的标量值。
写: 按照同样的思路,您为什么要为属性编写一个数组? 我编辑了一个示例,该示例在一个数组中存储了 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 :
我正在使用适用于 Linux 的 HDFView 2.9。正如 Timothy 提到的,这在 HDFView 2.10 中有效,同时我将使用 h5dump。
【问题讨论】:
-
有趣的是 HDFView 2.9 没有显示它。 Postgresql 仅以大端(又名网络字节顺序)传输数字。在与 Postgresql 交谈时,您真的应该使用
xdr()、ntohl()和朋友。为了抽象出您的应用程序不需要知道它正在运行的字节序这一事实。祝你好运!