【问题标题】:Difficulty parsing hdf5 compound data type难以解析 hdf5 复合数据类型
【发布时间】:2014-01-13 18:19:56
【问题描述】:

在 .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 成员时,除了价格字段之外,其他所有内容都无法识别。有人能看出我上面写的代码有什么问题吗?

【问题讨论】:

  • 您可能想尝试向后转动曲柄 - 填写您的数据结构并尝试将其写入磁盘 - 看看 h5dump 显示什么。

标签: c++ parsing hdf5


【解决方案1】:

内存磁盘中的数据表示是有区别的。 h5dump 告诉您事物是如何存储在磁盘上的。

例如,price 是 little-endian 32 位浮点数,但如果您的计算机是 big-endian,则库会在读取时为您转换它,并且内存表示将为 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);

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 2017-10-02
    • 1970-01-01
    • 2013-02-15
    • 2011-07-14
    • 2020-04-25
    • 2017-06-06
    • 1970-01-01
    • 2020-01-21
    相关资源
    最近更新 更多