Tag: hdf5

使用hdf5.net读取和编写引用类型

我正在使用HDF5DotNet编写通用数据记录API, DataLog 。 我们的想法是使用reflection来自动创建包含T字段的H5复合数据类型。 然后,用户可以使用write(T[] data)方法轻松地将数据添加到数据日志中。 为了自动创建H5类型,必须使用[StructLayoutAttribute]修饰类或结构,并使用[MarshalAsAttribute]修饰某些字段。 然后将每个字段映射到H5类型并添加到H5复合数据类型。 包含枚举或其他用户定义结构的类型有点复杂,但它们仍然有效。 从我在网上找到的例子中,我成功地创建了H5 Type,创建了一个数据集并为我创建的简单struct添加了一些数据。 当我将类型从struct更改为类时,会出现问题。 仍然创建了H5Type并且没有抛出exception,但是当我在HDF View中打开文件时,我可以看到正确的字段,但数据是垃圾。 我怀疑问题出现是因为在C#结构中是值类型而类是引用类型。 我使用以下代码来确定数据的基础结构是什么样的: public static byte[] GetBytes(dynamic obj) { var size = Marshal.SizeOf(obj); // Both managed and unmanaged buffers required. var bytes = new byte[size]; var ptr = Marshal.AllocHGlobal(size); // Copy object byte-to-byte to unmanaged memory. Marshal.StructureToPtr(obj, ptr, false); // Copy data […]

HDF5示例代码

使用HDF5DotNet ,任何人都可以指向我的示例代码,它将打开一个hdf5文件,提取数据集的内容,并将内容打印到标准输出? 到目前为止,我有以下内容: H5.Open(); var h5 = H5F.open(“example.h5”, H5F.OpenMode.ACC_RDONLY); var dataset = H5D.open(h5, “/Timings/aaPCBTimes”); var space = H5D.getSpace(dataset); var size = H5S.getSimpleExtentDims(space); 然后它有点混乱。 我实际上想对数据集的内容进行一些处理,但我认为一旦我转储到标准输出,我就可以从那里开始工作。 更新:我已经破解了这足以解决我自己的问题。 我没有意识到数据集是一个多数组 – 我认为它更像是一个数据库表。 万一有人对此感兴趣, double[,] dataArray = new double[size[0], 6]; var wrapArray = new H5Array(dataArray); var dataType = H5D.getType(d); H5D.read(dataset, dataType, wrapArray); Console.WriteLine(dataArray[0, 0]);