2016-06-30 7 views
0

unsigned charアレイをHDF5ファイルのfloatデータセットに書き込むと、ライブラリがエラーになることはありません。したがって、私は2つが実際に互換性があることを書く前に確認したいと思います。だから私のunsigned charアレイの場合、対応するPredTypeがあります。しかし、私が間違っていなければ、データセットはPredTypeを得る明らかな方法を提供していません。C++ライブラリを使用してHDF5でデータセットのPredTypeを調べる方法

質問:H5::Dataset考える、私はそれを初期化するために使用されたPredTypeの入手方法を教えてください。

答えて

1

https://www.hdfgroup.org/HDF5/doc/cpplus_RM/readdata_8cpp-example.htmlのサンプルコードは、これを行う方法を示しています。

要約すると、 DataSet::getTypeClass()機能を使用して保存されたデータの「クラス」を見つけることができます。しかし、この「クラス」は、ネイティブ・タイプのサイズ(つまり8ビット、32ビットなど)または符号表現(つまり符号なしの2の補数)を推測させることができないため、データ型を完全に定義するわけではありません。

フロートの場合。あなたもDataSet::getFloatType()を使用して、データ型がのようにPredType::NATIVE_FLOATまたはPredType::NATIVE_DOUBLEであれば推論するFloatType::getSize()を使用する必要があります。

auto dataClass = dataSet.getTypeClass(); 

if(dataClass == H5T_FLOAT) 
{ 
    auto floatType = dataSet.getFloatType(); 

    size_t byteSize = floatType.getSize(); 

    if(byteSize == 4) 
    { 
     // use PredType::NATIVE_FLOAT to write 
    } 
    else if(byteSize == 8) 
    { 
     // use PredType::NATIVE_DOUBLE to write 
    } 
} 

整数の符号表現について、あなたはIntType::getSign()を使用する必要があります。

+0

これがなぜHDF5-Libraryの機能として組み込まれていないのか不思議です。あなたの方法は常に正しいですか?または、あなたが使用した仮定がありますか? – NOhs

+0

今は失敗するケースは一切見つからないので、私はその投稿を更新します。 –

0

問題を解決するための別の方法(すなわちHDF5データセットのデータ型を見つけるためには)次のようにC++のためのツールHDFqlを使用することです(この例では、ファイルexample.h5とデータセットmy_datasetがすでに存在していることを前提としてい):

// include HDFql C++ header file (make sure it can be found by the C++ compiler) 
#include <iostream> 
#include "HDFql.hpp" 

int main(int argc, char *argv[]) 
{ 
    int datatype; 

    // use (i.e. open) HDF file "example.h5" 
    HDFql::execute("USE FILE example.h5"); 

    // get datatype of dataset "my_dataset" and populate HDFql default cursor with it 
    HDFql::execute("SHOW DATATYPE my_dataset"); 

    // move HDFql default cursor to first position 
    HDFql::cursorFirst(); 

    // retrieve datatype from HDFql default cursor 
    datatype = *HDFql::cursorGetInt(); 

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

    return 0; 
} 

最終的に、エンディアンまたはデータセットmy_datasetのサイズを取得する必要がある場合は、HDFql::execute("SHOW ENDIANNESS my_dataset");またはHDFql::execute("SHOW SIZE my_dataset");を実行します。

関連する問題