c++ - 难以解析 hdf5 复合数据类型

标签 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 成员时,除了 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/

相关文章:

c++ - 在需要 sudo 运行的 NetBeans 8.0 中调试 C++ 程序

c++ - 有没有办法获取正在运行或新打开的资源管理器窗口的IExplorerBrowser接口(interface),以便后续调用BrowseToXXX?

parsing - powershell从命令输出中获取内容

python - 使用 Pandas、Python 将数据附加到 HDF5 文件

Python pandas 使用 read_hdf 和 HDFStore.select 从 HDF5 文件读取特定值

python-3.x - Python - 快速 HDF5 时间序列数据查询

c++ - Cocos2d-x 子类化问题 CCMenuItemImage

javascript - 如何安全地评估在 JavaScript 中表示为字符串的 bool 表达式?

java - 基于上下文无关文法解析正则表达式

c++ - 文件是为归档而构建的,而不是链接的体系结构(x86_64)