如何获取本机类型的HDF5属性?

时间:2017-05-19 14:11:54

标签: c# hdf5

我正在使用Visual Studio(C#)和HDF5 P / Invoke。

我制作了一个HDF5文件,其中的组和数据集具有不同数据类型的属性(在这种情况下,让我们说它是一个整数,保存为H5T.NATIVE_INT32,但我对其他数据类型有同样的问题) 。现在我正在制作一个代码来读取HDF5文件中的数据。要读取属性值,我首先需要确定属性值的数据类型。我尝试过以下方法:

attributeId = H5A.open(groupId, attributeName, H5P.DEFAULT);
hid_t attributeSpace = H5A.get_space(attributeId);
H5S.class_t extentType = H5S.get_simple_extent_type(attributeSpace);
hid_t typeId = H5A.get_type(attributeId);
attributeClass = H5T.get_class(typeId);
type = H5T.get_native_type(typeId, H5T.direction_t.DEFAULT);
H5T.close(typeId);

但是,生成的变量typeH5T.NATIVE_INTEGER类型或我能想到的任何其他H5T类型不匹配。事实上,甚至

H5T.get_native_type(H5T.NATIVE_INT,H5T.direction_t.DEFAULT) == H5T.NATIVE_INT

返回false,因此看起来好像H5T.get_native_type()没有返回类型,但可能是它的副本或指针,它与类型本身不同。这是预期的行为还是一个错误?关于如何正确计算属性值类型的任何想法?

2 个答案:

答案 0 :(得分:1)

HDF5封装了数据,您应该使用HDF5例程来处理它们。您获得的值称为“类型标识符”,它们是HDF5 opaque数据类型。

您应该使用H5Tequal来评估两种类型标识符类型的相等性

H5Tequal(type, H5T.NATIVE_INT)

PS:我是以HD API的C API为视角写的,希望它也适用于你的情况。

答案 1 :(得分:0)

解决问题的另一种方法(即找出HDF5属性的数据类型)是使用工具HDFql进行C#,如下所示:

using AS.HDFql;

public class Example
{
    public static void Main(string []args)
    {

        int datatype;

        // create an HDF file named "example.h5" and use (i.e. open) it
        HDFql.Execute("CREATE FILE example.h5");
        HDFql.Execute("USE FILE example.h5");

        // create an attribute named "attrib" of type float
        HDFql.Execute("CREATE ATTRIBUTE attrib AS FLOAT");

        // get datatype of attribute "attrib" and populate HDFql default cursor with it
        HDFql.Execute("SHOW DATATYPE attrib");

        // move HDFql default cursor to first position
        HDFql.CursorFirst();

        // retrieve datatype from HDFql default cursor
        datatype = (int) HDFql.CursorGetInt();

        // print message according to datatype
        if (datatype == HDFql.TinyInt || datatype == HDFql.VarTinyInt)
            System.Console.WriteLine("Datatype is a char");
        else if (datatype == HDFql.UnsignedTinyInt || datatype == HDFql.UnsignedVarTinyInt)
            System.Console.WriteLine("Datatype is an unsigned char");
        else if (datatype == HDFql.SmallInt || datatype == HDFql.VarSmallInt)
            System.Console.WriteLine("Datatype is a short");
        else if (datatype == HDFql.UnsignedSmallInt || datatype == HDFql.UnsignedVarSmallInt)
            System.Console.WriteLine("Datatype is an unsigned short");
        else if (datatype == HDFql.Int || datatype == HDFql.VarInt)
            System.Console.WriteLine("Datatype is an int");
        else if (datatype == HDFql.UnsignedInt || datatype == HDFql.UnsignedVarInt)
            System.Console.WriteLine("Datatype is an unsigned int");
        else if (datatype == HDFql.BigInt || datatype == HDFql.VarBigInt)
            System.Console.WriteLine("Datatype is a long long");
        else if (datatype == HDFql.UnsignedBigInt || datatype == HDFql.UnsignedVarBigInt)
            System.Console.WriteLine("Datatype is an unsigned long long");
        else if (datatype == HDFql.Float || datatype == HDFql.VarFloat)
            System.Console.WriteLine("Datatype is a float");
        else if (datatype == HDFql.Double || datatype == HDFql.VarDouble)
            System.Console.WriteLine("Datatype is a double");
        else if (datatype == HDFql.Char || datatype == HDFql.VarChar)
            System.Console.WriteLine("Datatype is a char");
        else if (datatype == HDFql.Opaque)
            System.Console.WriteLine("Datatype is an opaque");
        else
            System.Console.WriteLine("Unknown datatype");

    }

}

如果您需要获取字段attrib的字节序或大小,请执行HDFql.Execute("SHOW ENDIANNESS attrib");HDFql.Execute("SHOW SIZE attrib");