繁体   English   中英

如何使用HDF.Pinvoke读取HDF5数据集?

[英]How to read HDF5 dataset with HDF.Pinvoke?

我开始使用此https://github.com/HDFGroup/HDF.PInvoke来处理HDF5文件。 但是文档非常差。 我想读取数据集。 我使用此函数:H5D.read(...)。 该函数的最后一个参数是buf,其类型为System.IntPtr。 我对此参数有疑问。 您能否通过示例说明如何读取整个数据集以及如何定义此参数? 我要读取的数据集是float的3维数组。 我用VB.net编写,但是用C#编写示例也可以。 非常感谢。

因此,我基于此编写了一个解决方案: https : //github.com/HDFGroup/HDF.PInvoke/wiki/Cookbook- : -Strings

在上面的链接中,读取了一维字符串数据集。

我的解决方案是通用的(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM