如何用 HDF.Pinvoke 读取 HDF5 数据集?
How to read HDF5 dataset with HDF.Pinvoke?
我开始使用这个 https://github.com/HDFGroup/HDF.PInvoke 来处理 HDF5 文件。但是文档很差。我想阅读数据集。我使用这个功能:
H5D.read(...)。这个函数的最后一个参数是buf,类型是System.IntPtr。我对该参数有疑问。你能帮我举例说明如何读取整个数据集以及如何定义此参数吗?
我要读取的数据集是 3 维浮点数组。
我在 VB.net 中编写,但 C# 中的示例也可以。
非常感谢。
所以,我基于这个写了一个解决方案:https://github.com/HDFGroup/HDF.PInvoke/wiki/Cookbook-:-Strings
在上面link读取字符串的一维数据集。
我的解决方案是通用的(BitConverter部分除外),可以读取各种维度和数据类型的数据集:
Dim dsID = H5D.open(hdf5fileId, dsname, H5P.DEFAULT)
Dim spaceID = H5D.get_space(dsID)
Dim typeID = H5D.get_type(dsID)
Dim rank = H5S.get_simple_extent_ndims(spaceID)
Dim dims(rank - 1) As ULong
Dim maxDims(rank - 1) As ULong
H5S.get_simple_extent_dims(spaceID, dims, maxDims)
Dim sizeData = H5T.get_size(typeID)
Dim size = sizeData.ToInt32()
Dim bytearray_elements = 1
For i = 0 To dims.Length - 1
bytearray_elements *= dims(i)
Next
Dim dataBytes(bytearray_elements * CULng(size)) As Byte
Dim pinnedArray As GCHandle = GCHandle.Alloc(dataBytes, GCHandleType.Pinned)
H5D.read(dsID, typeID, H5S.ALL, H5S.ALL, H5P.DEFAULT, pinnedArray.AddrOfPinnedObject())
pinnedArray.Free()
' Read all dataset in loop, val by val
For i = 0 To bytearray_elements-1:
Dim slice = idlist_byte.Skip(i * size).Take(size).ToArray()
Dim val = BitConverter.ToSingle(slice, 0)
Next
我开始使用这个 https://github.com/HDFGroup/HDF.PInvoke 来处理 HDF5 文件。但是文档很差。我想阅读数据集。我使用这个功能: H5D.read(...)。这个函数的最后一个参数是buf,类型是System.IntPtr。我对该参数有疑问。你能帮我举例说明如何读取整个数据集以及如何定义此参数吗? 我要读取的数据集是 3 维浮点数组。 我在 VB.net 中编写,但 C# 中的示例也可以。 非常感谢。
所以,我基于这个写了一个解决方案:https://github.com/HDFGroup/HDF.PInvoke/wiki/Cookbook-:-Strings
在上面link读取字符串的一维数据集。
我的解决方案是通用的(BitConverter部分除外),可以读取各种维度和数据类型的数据集:
Dim dsID = H5D.open(hdf5fileId, dsname, H5P.DEFAULT)
Dim spaceID = H5D.get_space(dsID)
Dim typeID = H5D.get_type(dsID)
Dim rank = H5S.get_simple_extent_ndims(spaceID)
Dim dims(rank - 1) As ULong
Dim maxDims(rank - 1) As ULong
H5S.get_simple_extent_dims(spaceID, dims, maxDims)
Dim sizeData = H5T.get_size(typeID)
Dim size = sizeData.ToInt32()
Dim bytearray_elements = 1
For i = 0 To dims.Length - 1
bytearray_elements *= dims(i)
Next
Dim dataBytes(bytearray_elements * CULng(size)) As Byte
Dim pinnedArray As GCHandle = GCHandle.Alloc(dataBytes, GCHandleType.Pinned)
H5D.read(dsID, typeID, H5S.ALL, H5S.ALL, H5P.DEFAULT, pinnedArray.AddrOfPinnedObject())
pinnedArray.Free()
' Read all dataset in loop, val by val
For i = 0 To bytearray_elements-1:
Dim slice = idlist_byte.Skip(i * size).Take(size).ToArray()
Dim val = BitConverter.ToSingle(slice, 0)
Next