如何获取HDF5数据集对应的C++数据类型以调用正确read重载方法?
解决HDF5读取.mat未知数据类型的问题
你可以通过HDF5的DataType类提供的方法,先判断数据的类型类别和具体类型,再调用对应的read重载方法。以下是具体实现思路和代码示例:
核心判断逻辑
利用H5::DataType的方法获取类型信息:
getClass():返回数据类型的大类(整数、浮点数、字符串、位域等),对应枚举H5T_class_tgetSize():获取数据类型的字节长度,辅助判断具体类型(比如4字节对应float,8字节对应double)getSign():针对整数类型,判断是有符号还是无符号equal():可以直接和预定义的HDF5类型比较(比如H5T_STD_B8LE对应Matlab的布尔值)
代码示例
H5::DataSet data_set; try { data_set = file->openDataSet("/USER_SETTINGS/UNKNOWN_ITEM"); } catch (H5::LocationException e) { return false; } H5::DataSpace data_space = data_set.getSpace(); H5::DataType data_type = data_set.getDataType(); // 根据数据类型分支处理 switch(data_type.getClass()) { case H5T_STRING: { std::string rtnStringValue; data_set.read(rtnStringValue, data_type, data_space); // 处理字符串数据 break; } case H5T_FLOAT: { if (data_type.getSize() == 8) { // double类型 double double_val; data_set.read(&double_val, H5T_NATIVE_DOUBLE, data_space); // 处理double数据 } else if (data_type.getSize() == 4) { // float类型 float float_val; data_set.read(&float_val, H5T_NATIVE_FLOAT, data_space); // 处理float数据 } break; } case H5T_INTEGER: { size_t type_size = data_type.getSize(); H5T_sign_t sign = data_type.getSign(); if (type_size == 4) { if (sign == H5T_SGN_2) { // 有符号32位整数 int32_t int_val; data_set.read(&int_val, H5T_NATIVE_INT, data_space); // 处理int数据 } else { // 无符号32位整数 uint32_t uint_val; data_set.read(&uint_val, H5T_NATIVE_UINT, data_space); // 处理uint数据 } } else if (type_size == 8) { if (sign == H5T_SGN_2) { // 有符号64位整数 int64_t int64_val; data_set.read(&int64_val, H5T_NATIVE_INT64, data_space); } else { // 无符号64位整数 uint64_t uint64_val; data_set.read(&uint64_val, H5T_NATIVE_UINT64, data_space); } } // 可扩展处理1字节、2字节整数 break; } case H5T_BITFIELD: { // Matlab的布尔值通常存储为1字节的位域,对应H5T_STD_B8LE if (data_type.equal(H5T_STD_B8LE)) { bool bool_val; data_set.read(&bool_val, H5T_NATIVE_B8, data_space); // 处理布尔数据 } break; } default: // 处理未知类型 break; }
注意事项
- Matlab的.mat文件对部分类型有特殊存储方式,比如字符串可能是可变长度数组,你之前的字符串处理逻辑可以直接复用
- 对于整数类型,建议用固定大小的C++类型(如
int32_t而非int),避免平台差异 - 可以通过
H5::DataType::getSuper()获取基类型,处理一些自定义类型的情况
内容的提问来源于stack exchange,提问作者tzg
相关产品推荐
相关产品推荐

