2017-05-19 4 views
0

Visual Studio(C#)とHDF5 P/Invokeを使用しています。ネイティブタイプのHDF5属性を取得するにはどうすればよいですか?

異なるデータ型の属性を持つグループとデータセットを持つ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()かのように見えるが、おそらくコピーまたはタイプ自体と同一ではありません、それへのポインタ、。これは予想される動作かバグですか?属性値の型を正しく理解する方法に関するアイデアはありますか?

答えて

1

HDF5はデータをカプセル化し、HDF5ルーチンを使用してそれらを処理する必要があります。取得する値は「型識別子」と呼ばれ、HDF5の不透明なデータ型です。

次の2つのタイプ識別子

の種類の平等性を評価するために H5Tequalを使用する必要があります
H5Tequal(type, H5T.NATIVE_INT) 

PS:私は、HDF5のC APIの視点でこれを書いて、それはあなたのケースに適用されます願っていますあまりにも。

0

問題を解決するための別の方法は、(すなわちHDF5属性のデータ型を見つけるために)、以下のようにC#のためのツール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");を実行します。

関連する問題