所以我剛剛發現,如果我在我的HDF5文件中寫入unsigned char
數組到float
數據集,庫不會發生抱怨。因此,在我寫這兩個實際兼容之前,我想檢查一下。所以對於我的unsigned char
陣列,我有相應的PredType
。但是如果我沒有弄錯的話,數據集並沒有提供明確的方法來獲得PredType
。如何獲得PredType
用於初始化它?如何使用C++庫找出HDF5中數據集的PredType
0
A
回答
1
https://www.hdfgroup.org/HDF5/doc/cpplus_RM/readdata_8cpp-example.html上的示例代碼演示瞭如何執行此操作。
總之;你可以找到使用DataSet::getTypeClass()
函數存儲的數據的「類」。然而,這個「類」並沒有完全定義數據類型,因爲它不會讓你推斷本地類型的大小(即8位,32位等)或符號表示(即無符號,2的補碼) 。
在浮動的情況下;你還需要使用DataSet::getFloatType()
和使用FloatType::getSize()
來推斷,如果數據類型是PredType::NATIVE_FLOAT
或PredType::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數據集的數據類型)如下使用的工具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");
。
相關問題
- 1. 如何使用C++將字符串附加到HDF5數據集?
- 2. 使用C#中的HDF5實時數據
- 3. mmap hdf5數據集在C/C++
- 4. 嘗試在Keras中使用HDF5數據集時出錯
- 5. 如何存儲辭典HDF5數據集
- 6. 使用HDF5設置數據集上的屬性C++ api
- 7. C讀取大數據集變成HDF5慢(使用HD5_read)
- 8. 如何用PHPmyAdmin找出數據庫和表的字符集?
- 9. 在Windows上使用CMake的HDF5庫(錯誤:「找不到HDF5」)
- 10. 搜索HDF5數據集
- 11. Chunked HDF5數據集和slabsize
- 12. HDF5數據集中事件的鏈接
- 13. 如何用oracle數據庫中的C#填充數據集
- 14. 如何找出數據庫中未使用的列(SQL Server 2008)。
- 15. 將多個數據集從.hdf5導出到python中的csv
- 16. 如何知道python中的HDF5數據集名稱
- 17. 如何通過C或C++ API獲取HDF5數據集的名稱?
- 18. 如何使用數據集中的值更新數據庫?
- 19. 用C結構讀HDF5單維數據集化合物並聯
- 20. 調整Julia的HDF5數據集
- 21. 如何在HDF5中製作多維數據集?
- 22. 如何找出使用DMV的數據倉庫的當前DWU?
- 23. 如何使用c中的數據集加載數據表#
- 24. 如何使用查找來編輯數據庫中的數據?
- 25. 如何從C#中的數據庫中取出數據#
- 26. 如何找出MySQL數據庫中數據的總大小?
- 27. 使用H5PY在HDF5數據庫中搜索屬性值
- 28. 使用HDF5庫重命名和刪除HDF5文件中的組
- 29. 如何找出哪些數據集使用MATLAB破壞我的數據分析?
- 30. C#OLE DB:如何使用數據集重新排列數據庫表的列?
讓你想知道爲什麼這不包括在HDF5庫中作爲一個功能。你的方法是否正確無誤?還是有你使用的假設? – NOhs
我看不到任何現在會失敗的情況,如果我這樣做,我會更新該帖子。 –