如何使用C ++库找出HDF5中数据集的PredType

时间:2016-06-30 17:12:20

标签: c++ hdf5

所以我发现,如果我将unsigned char数组写入我的HDF5文件中的float数据集,那么该库就不会抱怨。因此,我想在写之前检查两者是否实际兼容。因此,对于我的unsigned char数组,我有相应的PredType。但是,如果我没有弄错的话,数据集并没有提供明显的方法来获取PredType

问题:鉴于H5::Dataset,如何获取用于初始化它的PredType

2 个答案:

答案 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_datasetHDFql::execute("SHOW ENDIANNESS my_dataset");