如何找出一个数据集的PredType在HDF5使用c++库
How to find out the PredType of a dataset in HDF5 using the C++ library
所以我刚刚发现,如果我在HDF5文件中将unsigned char
数组写入float
数据集,则库不会抱怨。因此,在我写之前,我想检查一下这两个实际上是兼容的。对于unsigned char
数组,我有相应的PredType
。但是数据集并没有提供一个明显的方法来获得PredType
,如果我没有弄错的话。
问题:给定H5::Dataset
,我如何获得用于初始化它的PredType
?
https://www.hdfgroup.org/HDF5/doc/cpplus_RM/readdata_8cpp-example.html上的示例代码演示了如何做到这一点。
在总结;可以找到使用DataSet::getTypeClass()
函数存储的数据的"类"。然而,这个"类"并没有完全定义数据类型,因为它不允许您推断本机类型的大小(例如8位,32位……等)或符号表示(例如unsigned, 2的补码)。
在float;您还需要使用DataSet::getFloatType()
和FloatType::getSize()
来推断数据类型是PredType::NATIVE_FLOAT
还是PredType::NATIVE_DOUBLE
,如:
auto dataClass = dataSet.getTypeClass();
if(dataClass == H5T_FLOAT)
{
auto floatType = dataSet.getFloatType();
size_t byteSize = floatType.getSize();
if(byteSize == 4)
{
// use PredType::NATIVE_FLOAT to write
}
else if(byteSize == 8)
{
// use PredType::NATIVE_DOUBLE to write
}
}
对于整数的符号表示,您需要使用IntType::getSign()
另一种解决问题的方法(即找出HDF5数据集的数据类型)是使用工具HDFql的c++如下(这个例子假设文件example.h5
和数据集my_dataset
已经存在):
// include HDFql C++ header file (make sure it can be found by the C++ compiler)
#include <iostream>
#include "HDFql.hpp"
int main(int argc, char *argv[])
{
int data_type;
// get data type of dataset "my_dataset" from HDF5 file "example.h5" and populate HDFql default cursor with it
HDFql::execute("SHOW DATA TYPE example.h5 my_dataset");
// move HDFql default cursor to first position
HDFql::cursorFirst();
// retrieve data type from HDFql default cursor
data_type = *HDFql::cursorGetInt();
// print message according to data type
if (data_type == HDFql::TinyInt || data_type == HDFql::VarTinyInt)
std::cout << "Data type is a char";
else if (data_type == HDFql::UnsignedTinyInt || data_type == HDFql::UnsignedVarTinyInt)
std::cout << "Data type is an unsigned char";
else if (data_type == HDFql::SmallInt || data_type == HDFql::VarSmallInt)
std::cout << "Data type is a short";
else if (data_type == HDFql::UnsignedSmallInt || data_type == HDFql::UnsignedVarSmallInt)
std::cout << "Data type is an unsigned short";
else if (data_type == HDFql::Int || data_type == HDFql::VarInt)
std::cout << "Data type is an int";
else if (data_type == HDFql::UnsignedInt || data_type == HDFql::UnsignedVarInt)
std::cout << "Data type is an unsigned int";
else if (data_type == HDFql::BigInt || data_type == HDFql::VarBigInt)
std::cout << "Data type is a long long";
else if (data_type == HDFql::UnsignedBigInt || data_type == HDFql::UnsignedVarBigInt)
std::cout << "Data type is an unsigned long long";
else if (data_type == HDFql::Float || data_type == HDFql::VarFloat)
std::cout << "Data type is a float";
else if (data_type == HDFql::Double || data_type == HDFql::VarDouble)
std::cout << "Data type is a double";
else if (data_type == HDFql::Char || data_type == HDFql::VarChar)
std::cout << "Data type is a char";
else if (data_type == HDFql::Opaque)
std::cout << "Data type is an opaque";
else if (data_type == HDFql::Enumeration)
std::cout << "Data type is an enumeration";
else if (data_type == HDFql::Compound)
std::cout << "Data type is a compound";
else
std::cout << "Unknown data type";
return 0;
}
最后,如果您需要获取数据集my_dataset
的端序或大小,请执行HDFql::execute("SHOW ENDIANNESS example.h5 my_dataset");
或HDFql::execute("SHOW SIZE example.h5 my_dataset");
。
- 使用g++编译hdf5源代码
- HDF5 简单读取数据集失败
- H5Tget_member_type() 返回复合 HDF5 数据类型的奇怪值
- C++创建空 HDF5 文件而不是数据集的代码
- HDF5 构建了并行支持,但找不到特定于 mpi 的功能
- C++:犰狳不想与hdf5格式合作
- 使用串行HDF5 C++与CMake
- HDF5 C++ Qt 冲突声明
- 如何编译同时使用 MPI 和 HDF5 的C++文件?
- HDF5链接错误
- HDF5:检查创建组
- OpenMP:编写与HDF5同步的数据
- 创建一个模板函数来读取 hdf5 中的任意数据类型
- (C++)在 HDF5 中编写数据库
- 如何在 HDF5 中逐个存储组数组
- 如何在C++中读取 HDF5 对象引用
- 用于创建 HDF5 数据集的 4 维 c++ 数组的动态内存分配
- 一个HDF5文件中有多少个数据集
- HDF5-写入/附加HDF5复合数据类型一一带有HyperSlab
- 如何找出一个数据集的PredType在HDF5使用c++库