gpt4 book ai didi

c - 如何读取 h5py 在 C 中创建的 hdf5 bool 枚举

转载 作者:行者123 更新时间:2023-12-02 08:47:12 24 4
gpt4 key购买 nike

我使用 numpy 创建了一个包含 3 个 double 值和一个 bool 值的数组,并使用 h5py 将它们写入文件:

import numpy as np
import h5py

data = np.zeros(10, dtype=[("THETA",np.double),("PHI",np.double),("PSI",np. double),("FLAG",np.bool)])

with h5py.File("testout.h5") as f:
f.create_dataset("data", data=data)

h5py 为 bool 字段创建一个枚举类型:

HDF5 "testout.h5" {
GROUP "/" {
DATASET "data" {
DATATYPE H5T_COMPOUND {
H5T_IEEE_F64LE "THETA";
H5T_IEEE_F64LE "PHI";
H5T_IEEE_F64LE "PSI";
H5T_ENUM {
H5T_STD_I8LE;
"FALSE" 0;
"TRUE" 1;
} "FLAG";
}
DATASPACE SIMPLE { ( 10 ) / ( 10 ) }
}
}
}

现在我需要用 C 读取这个文件,事情变得复杂了:

typedef enum {
false = 0;
true
} bool;

typedef struct {
double THETA, PHI, PSI;
bool FLAG;
} pointing_t;

我不明白如何定义具有枚举的类型:

hid_t memtype = H5Tcreate (H5T_COMPOUND, sizeof(pointing_t));
H5Tinsert (memtype, "THETA", HOFFSET (pointing_t, THETA), H5T_NATIVE_DOUBLE);
H5Tinsert (memtype, "PHI", HOFFSET (pointing_t, PHI), H5T_NATIVE_DOUBLE);
H5Tinsert (memtype, "PSI", HOFFSET (pointing_t, PSI), H5T_NATIVE_DOUBLE);
# this should be an ENUM!!
H5Tinsert (memtype, "FLAG", HOFFSET (pointing_t, FLAG), H5T_NATIVE_DOUBLE);

我在 gist 上粘贴了一个完整的“不工作”示例,该示例试图读取使用之前的 python 片段创建的 hdf5 文件:

http://gist.github.com/3168909

有人有建议吗?谢谢!

最佳答案

处理此问题的更简单方法是使用 1 字节无符号字符来存储 bool 类型。在 h5py 中,您可以通过调用以下命令来存储 bool 数组

import h5py
import numpy as np

# Generate some boolean data

shape = (100, 100)
data = np.zeros(shape, dtype=np.bool)

# Save the boolean data as uchars

f = h5py.File('foo.h5')
dset = f.create_dataset('/bar', dtype='u1', shape=shape)
dset[:] = data[:]

在 C/C++ 中,您可以将 uchar 读入 bool* 数组,它们将被正确解释。这是因为它们是 1 字节的,就像 C/C++ bool 值一样,任何具有非零位的东西在 C/C++ 中都被解释为 true

关于c - 如何读取 h5py 在 C 中创建的 hdf5 bool 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11627376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com