2016-06-30 1 views
0

So habe ich gerade herausgefunden, dass, wenn ich ein unsigned char Array in einen float Datensatz in meiner HDF5-Datei schreibe die Bibliothek nicht klagen. Daher möchte ich überprüfen, bevor ich schreibe, dass die beiden tatsächlich kompatibel sind. Also für meine unsigned char Array habe ich die entsprechende PredType. Aber der Datensatz bietet keine offensichtliche Möglichkeit, die PredType zu bekommen, wenn ich mich nicht irre.Wie finde ich den PredType eines Datensatzes in HDF5 mit der C++ - Bibliothek

Frage: ein H5::Dataset gegeben, wie erhalte ich die PredType die verwendet wurde, um es zu initialisieren?

Antwort

1

Der Beispielcode auf https://www.hdfgroup.org/HDF5/doc/cpplus_RM/readdata_8cpp-example.html zeigt, wie dies zu tun ist.

Zusammenfassend; Sie können die "Klasse" der gespeicherten Daten mit der Funktion DataSet::getTypeClass() finden. Diese "Klasse" definiert den Datentyp jedoch nicht vollständig, da Sie nicht die Größe (dh 8-Bit, 32-Bit usw.) oder die Vorzeichendarstellung (dh vorzeichenlos, Zweierkomplement) für native Typen ableiten können .

Im Falle von Float; Sie müssen auch DataSet::getFloatType() verwenden und FloatType::getSize() verwenden zu schließen, wenn der Datentyp PredType::NATIVE_FLOAT oder PredType::NATIVE_DOUBLE wie in ist:

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 
    } 
} 

Für die Zeichen Darstellung von ganzen Zahlen, die Sie benötigen IntType::getSign() zu verwenden.

+0

Wundert sich, warum dies nicht als Feature in der HDF5-Library enthalten ist. Ist Ihre Methode immer korrekt? Oder gibt es Annahmen, die du benutzt hast? – NOhs

+0

Ich kann keinen Fall sehen, dass es jetzt scheitern würde, ich werde den Beitrag aktualisieren, wenn ich es tue. –

0

Ein andere Möglichkeit, das Problem zu lösen (dh zu dem Datentyp eines HDF5-Datensatz herausfinden) ist das Werkzeug HDFql für C++ wie folgt zu verwenden (in diesem Beispiel wird davon ausgegangen, dass die Datei example.h5 und Dataset my_dataset bereits vorhanden):

// 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; 
} 

Wenn Sie schließlich die Endianess oder die Größe des Datasets my_dataset benötigen, führen Sie HDFql::execute("SHOW ENDIANNESS my_dataset"); oder HDFql::execute("SHOW SIZE my_dataset"); aus.

Verwandte Themen