【问题标题】:How to read HDF5 dataset with HDF.Pinvoke?如何使用 HDF.Pinvoke 读取 HDF5 数据集?
【发布时间】:2019-06-24 13:47:21
【问题描述】:

我开始使用这个https://github.com/HDFGroup/HDF.PInvoke 来处理 HDF5 文件。但是文档很差。我想读取数据集。我使用这个功能: H5D.read(...)。这个函数的最后一个参数是buf,它的类型是System.IntPtr。我对那个参数有问题。你能帮我举例说明如何读取整个数据集以及如何定义这个参数吗? 我要读取的数据集是浮点的 3 维数组。 我用 VB.net 编写,但 C# 中的示例也可以。 非常感谢。

【问题讨论】:

    标签: vb.net hdf5 hdf


    【解决方案1】:

    所以,我根据这个写了一个解决方案: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
    

    【讨论】:

    • 应该先安装 NuGet HDF.PInvoke 吗?什么“使用??”应该用吗?
    • @DougNull 是的,你应该先安装它。您应该使用“使用 HDF.PInvoke”。
    猜你喜欢
    • 2020-03-21
    • 2016-10-27
    • 2020-10-06
    • 2019-11-15
    • 2016-06-05
    • 2019-03-04
    • 2019-06-09
    • 2015-04-17
    • 2019-08-02
    相关资源
    最近更新 更多