在 .h5 文件上使用 h5dump,我看到以下数据集:
GROUP "T" {
DATASET "CON" {
DATATYPE H5T_COMPOUND {
H5T_IEEE_F32LE "price";
H5T_STRING {
STRSIZE 1;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
} "label";
H5T_STD_I64LE "amount";
}
}
}
我用 C++ 创建了以下数据结构:
class RawData
{
public:
float price;
char label[2];
long amount;
};
H5File file2(hdf5Source, H5F_ACC_RDONLY);
DataSet dataset = file2.openDataSet("/T/CON");
size_t size = dataset.getInMemDataSize();
RawData *s = (ExegyRawData*) malloc(size);
CompType type = dataset.getCompType();
dataset.read(s, type);
RawData r = s[0];
当我输出 RawData 成员时,除了 price 字段之外,其他所有内容都无法识别。有人可以发现我上面编写的代码有什么问题吗?
最佳答案
内存 和磁盘 中的数据表示有区别。 h5dump
告诉您事物是如何存储在磁盘上的。
例如,price
是一个小端的 32 位 float ,但如果你的计算机是大端的,库会在读取时为你转换它,内存表示将是H5T_IEEE_F32BE
。
另一个问题可能是结构的填充。您的结构可能会对齐,这样您的成员的偏移量(以字节为单位)为 0、4 和 8。但是为了节省磁盘空间,库可能更喜欢偏移量为 0、4 和 6 的更紧凑的对齐方式。
解决方案: 创建一个合适的 H5::CompType
对应于你的结构。
CompType type(sizeof(RawData));
type.insertMember("price", HOFFSET(RawData, price), PredType::NATIVE_FLOAT);
type.insertMember("label", HOFFSET(RawData, label), StrType(0, 2));
type.insertMember("amount", HOFFSET(RawData, amount), PredType::NATIVE_LONG);
关于c++ - 难以解析 hdf5 复合数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20778978/