难以解析hdf5复合数据类型

时间:2013-12-26 04:06:19

标签: c++ parsing hdf5

在.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成员时,其他所有内容都无法识别。有人能发现我上面编写的代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

内存磁盘上的数据表示之间存在差异。 h5dump为您提供磁盘上存储内容的方式。

例如,price是一个小端32位浮点数,但如果您的计算机是big-endian,则库会在读取时为您转换,并且内存表示为{{1 }}

另一个问题可能是结构填充。有可能您的结构将被对齐,以便成员的字节偏移量为0,4和8.但是为了节省磁盘空间,库可能更喜欢使用偏移0,4和6的更紧凑的对齐。

解决方案:创建与您的结构相对应的正确H5::CompType

H5T_IEEE_F32BE