HDF5 записывает 32-разрядное целое число без знака в 64-разрядное на диске и считывает 32-разрядное целое число без знака

Я пытаюсь выписать вектор 32-битного unsigned int до 64-битного unsigned long на диске с использованием HDF5; а затем прочитать это обратно в 32 бит unsigned int в памяти. Для этого мои функции чтения-записи выглядят следующим образом (у меня есть все четко определенные функции для push_back, resizeи т.д. реализовано для моего 32-битного unsigned int контейнер, my_container):

bool write(const my_container<unsigned int>& p, const std::string& datapath, const H5::DateType& datatype):
try {
const hsize_t h5size[1] = { p.size() };
const H5::DataSpace h5space(1, h5size);
const H5::DataSet h5set = fileptr_->createDataSet(datapath, datatype, h5space);
//-Tried using void* here for data, no difference
const unsigned int* data = &(*p.begin());
h5set.write(data, datatype);
}
catch( H5::Exception& ) {
//-Handle exception here
return false;
}
return true;
}

read(my_container<unsigned int>& p, const H5::DataType& datatype, const std::string& datapath) {
H5::DataType h5set_datatype = h5set.getDataType();
const std::size_t size = (std::size_t)h5space.getSimpleExtentNpoints();
try {
if(h5set_datatype == H5::PredType::NATIVE_UINT64 && datatype == H5::PredType::NATIVE_UINT32 ) {
typedef unsigned long long u64;
typedef std::vector<u64> u64vec;
u64vec ivector;
ivector.resize(size);
void* data = (void*)(&(*ivector.begin()));
h5set.read(data, h5set_datatype);
p.resize(0);
BOOST_FOREACH(const u64 &v, ivector) {
//-I've handled the cast below using numeric cast separately
p.push_back(v);
}
} //-End compare datatypes on disk and memory
} //-End try
catch(const H5::Exception &e) {
//-Handle exception
return false;
}
return true;
}

Я звоню write с аргументами: const-ссылка на my_container, H5::Pred::NATIVE_UINT64, а также read с аргументами: ссылка на my_container а такжеH5::Pred::NATIVE_UINT32, Возможно, это может быть одним из источников проблемы. Дайте мне знать, если потребуется дальнейшее уточнение. По сути, я получаю мусор, когда читаю его обратно. Ценю предложения от любых экспертов HDF5 там. Спасибо за ваше время.

0

Решение

Решение состояло в том, чтобы изменить функцию записи для поддержки типов данных файлов и памяти:

bool write(const my_container<unsigned int>& p, const H5::DataType& file_datatype, const H5::DataType& mem_datatype, const std::string& datapath) const {

try {
const hsize_t h5size[1] = { p.size() };
const H5::DataSpace h5space(1, h5size);

const H5::DataSet h5set = fileptr_->createDataSet(datapath, file_datatype, h5space);
const void* data = &(*p.begin());
h5set.write(data, mem_datatype);
}
catch( H5::Exception& ) {
// Handle exception
return false;
}

return true;
}

Тогда все остальное работало как положено — функция чтения практически не изменилась; был в состоянии сделать то же самое даже для контейнеров пар беззнаковых целых и так далее. НТН.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]