所以我发现,如果我将unsigned char
数组写入我的HDF5文件中的float
数据集,那么该库就不会抱怨。因此,我想在写之前检查两者是否实际兼容。因此,对于我的unsigned char
数组,我有相应的PredType
。但是,如果我没有弄错的话,数据集并没有提供明显的方法来获取PredType
。
问题:鉴于H5::Dataset
,如何获取用于初始化它的PredType
?
答案 0 :(得分:1)
https://www.hdfgroup.org/HDF5/doc/cpplus_RM/readdata_8cpp-example.html上的示例代码演示了如何执行此操作。
总结;你可以找到使用DataSet::getTypeClass()
函数存储的数据的“类”。然而,这个“类”并没有完全定义数据类型,因为它不允许你推断本机类型的大小(即8位,32位......等)或符号表示(即无符号,2的补码) 。
在浮动的情况下;您还需要使用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()
。
答案 1 :(得分:0)
解决问题的另一种方法(即找出HDF5数据集的数据类型)是使用C ++工具HDFql,如下所示(此示例假定文件example.h5
和数据集{已经存在{1}}:
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 datatype;
// use (i.e. open) HDF file "example.h5"
HDFql::execute("USE FILE example.h5");
// get datatype of dataset "my_dataset" and populate HDFql default cursor with it
HDFql::execute("SHOW DATATYPE my_dataset");
// move HDFql default cursor to first position
HDFql::cursorFirst();
// retrieve datatype from HDFql default cursor
datatype = *HDFql::cursorGetInt();
// print message according to datatype
if (datatype == HDFql::TinyInt || datatype == HDFql::VarTinyInt)
std::cout << "Datatype is a char";
else if (datatype == HDFql::UnsignedTinyInt || datatype == HDFql::UnsignedVarTinyInt)
std::cout << "Datatype is an unsigned char";
else if (datatype == HDFql::SmallInt || datatype == HDFql::VarSmallInt)
std::cout << "Datatype is a short";
else if (datatype == HDFql::UnsignedSmallInt || datatype == HDFql::UnsignedVarSmallInt)
std::cout << "Datatype is an unsigned short";
else if (datatype == HDFql::Int || datatype == HDFql::VarInt)
std::cout << "Datatype is an int";
else if (datatype == HDFql::UnsignedInt || datatype == HDFql::UnsignedVarInt)
std::cout << "Datatype is an unsigned int";
else if (datatype == HDFql::BigInt || datatype == HDFql::VarBigInt)
std::cout << "Datatype is a long long";
else if (datatype == HDFql::UnsignedBigInt || datatype == HDFql::UnsignedVarBigInt)
std::cout << "Datatype is an unsigned long long";
else if (datatype == HDFql::Float || datatype == HDFql::VarFloat)
std::cout << "Datatype is a float";
else if (datatype == HDFql::Double || datatype == HDFql::VarDouble)
std::cout << "Datatype is a double";
else if (datatype == HDFql::Char || datatype == HDFql::VarChar)
std::cout << "Datatype is a char";
else if (datatype == HDFql::Opaque)
std::cout << "Datatype is an opaque";
else
std::cout << "Unknown datatype";
return 0;
}
的字节顺序或大小,请执行my_dataset
或HDFql::execute("SHOW ENDIANNESS my_dataset");
。