HDF5DotNet : Enumデータの書込・読込2013年02月19日 22:24

ENUMデータの書込み、読込みについて。

ENUMデータを書き込むには、"H5T"クラスにある"createEnum"メソッドを使用して"H5DataTypeID"クラスを作成する。引数は"H5T.H5Type"の列挙なので、適当に指定。NATIVE_INTなどでいいと思う。
H5DataTypeId typeID = H5T.enumCreate( H5T.H5Type.NATIVE_INT );
次に、書き込むデータとHDFViewなどを使用した場合に表示されるデータを準備する。使うメソッドは"H5T"クラスにある"enumInsert"のジェネリックメソッド。
引数は以下の通り
 "typeId" : "H5DataTypeId"クラス、上記のメソッドで取得したものを使用する
 "name" : "string"クラス 、表示する名前
 "value" : "ref int"クラス 、名前表示と関係させる値
例えば、bool値"True"と"False"を作成する場合は、以下のようにする。
int f_index = 0;
int t_index = 1;
H5T.enumInsert<int>( typeID, "FALSE"ref f_index ); H5T.enumInsert<int>( typeID, "TRUE"ref t_index );
あとは"H5DataSetId"クラスを作成して、"write<>"してやればいい。

値を読み込む場合は、値型を読み込む方法を行えば、数値が取得できる。
その後、"H5DataTypeId"クラスを使用して表示名を取り出す。取り出す際に使用するメソッドは"H5T"クラスにある"enumNameOf"というジェネリックメソッドを使用する。引数、戻り値は以下の通り。
 "typeId" : "H5DataTypeId"クラス、読み込み時に使用したもの
 "value" : "ref int"クラス、データと関連付けた値を使用。要は読み取り時に取得した値。
 戻り値:"string"クラス。関連付けた名前
string name = H5T.enumNameOf<int>( rTypeID, ref index );
戻ってきた値を調べて、再びenum値に戻してやればC#上で使用できるようになる。
以下、サンプル。
//	書込みサンプル
H5FileId
 fileID = H5F.open( "C:\\HDFSampleFile.hdf5"H5F.OpenMode.ACC_RDWR ); H5DataSpaceId spaceID = H5S.create_simple( 1new long[] { 1 } ); H5DataTypeId typeID = H5T.enumCreate( H5T.H5Type.NATIVE_INT );
H5DataSetId
 dataSetID = H5D.create( fileID,"ENUMDataSet",typeID ,spaceID  ); int[] intArray = new int[] { 1 }; H5Array<int> array = new H5Array<int>( intArray ); H5D.write<int>( dataSetID, dataTypeId, array ); H5D.close( dataSetID ); H5T.close( dataTypeId );
H5S.close( spaceID ); H5F.close( fileID );
//	読み込みサンプル
H5FileId
fileID = H5F.open( "C:\\HDFSampleFile.hdf5", H5F.OpenMode.ACC_RDWR ); H5DataSetId datasetID = H5D.open( fileID, "ENUMDataSet" );
H5DataTypeId typeId = H5D.getType( datasetID ); int[] intArray = new int[1];
H5Array<int> array = new H5Array<int>( intArray );
H5D.read<int>( datasetID , typeId , new H5Array<int>( array ) ); int index = intArray[ 0 ];
// これで文字列で関連付けた表示が取得される。
string name = H5T.enumNameOf<int>( typeId , ref index );
H5D.close( dataSetID ); H5T.close( typeId );
H5F.close( fileID );