在.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成员时,其他所有内容都无法识别。有人能发现我上面编写的代码有什么问题吗?
答案 0 :(得分:1)
内存和磁盘上的数据表示之间存在差异。 h5dump
为您提供磁盘上存储内容的方式。
例如,price
是一个小端32位浮点数,但如果您的计算机是big-endian,则库会在读取时为您转换,并且内存表示为{{1 }}
另一个问题可能是结构填充。有可能您的结构将被对齐,以便成员的字节偏移量为0,4和8.但是为了节省磁盘空间,库可能更喜欢使用偏移0,4和6的更紧凑的对齐。
解决方案:创建与您的结构相对应的正确H5::CompType
。
H5T_IEEE_F32BE