2016-06-30 63 views
0

所以我剛剛發現,如果我在我的HDF5文件中寫入unsigned char數組到float數據集,庫不會發生抱怨。因此,在我寫這兩個實際兼容之前,我想檢查一下。所以對於我的unsigned char陣列,我有相應的PredType。但是如果我沒有弄錯的話,數據集並沒有提供明確的方法來獲得PredType。如何獲得PredType用於初始化它?如何使用C++庫找出HDF5中數據集的PredType

回答

1

https://www.hdfgroup.org/HDF5/doc/cpplus_RM/readdata_8cpp-example.html上的示例代碼演示瞭如何執行此操作。

總之;你可以找到使用DataSet::getTypeClass()函數存儲的數據的「類」。然而,這個「類」並沒有完全定義數據類型,因爲它不會讓你推斷本地類型的大小(即8位,32位等)或符號表示(即無符號,2的補碼) 。

在浮動的情況下;你還需要使用DataSet::getFloatType()和使用FloatType::getSize()來推斷,如果數據類型是PredType::NATIVE_FLOATPredType::NATIVE_DOUBLE爲:

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庫中作爲一個功能。你的方法是否正確無誤?還是有你使用的假設? – NOhs

+0

我看不到任何現在會失敗的情況,如果我這樣做,我會更新該帖子。 –

0

解決問題的另一種方式(即找出一個HDF5數據集的數據類型)如下使用的工具HDFql用於C++(這個例子中假定該文件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");

相關問題