Как читать набор данных HDF5 с помощью HDF.Pinvoke? - PullRequest
0 голосов
/ 31 января 2019

Я начал использовать это https://github.com/HDFGroup/HDF.PInvoke для работы с файлами HDF5.Но документация очень плохая.Я хочу прочитать набор данных.Я использую эту функцию: H5D.read (...).Последний параметр этой функции - buf, тип которого - System.IntPtr.И у меня есть проблемы с этим параметром.Не могли бы вы помочь мне с примером того, как прочитать весь набор данных и как определить этот параметр?Набор данных, который я хочу прочитать, - это трехмерный массив с плавающей точкой.Я пишу на VB.net, но пример на C # тоже будет хорошо.Большое спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

Итак, я написал решение, основанное на этом: https://github.com/HDFGroup/HDF.PInvoke/wiki/Cookbook-:-Strings

В приведенной выше ссылке читается набор строк 1D.

Мое решение универсально (кроме части 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
...