/** Loads a darx data archive from a file into the structure. * * @param[in] darx - reference to the darx structure to fill * @param[in] file - pointer to the file containing the darx data * * @returns an error code indicating success or reson of failure * @note reads only uncompressed 8,16 and 32 bit-per-pixel bmp images. */ ErrorCode load_image_from(darx& darx, FILE* file){ data_type_info dtinfo; char magic[DARX_MAGIC_LEN+1]; fread(magic, sizeof(char), DARX_MAGIC_LEN, file); magic[DARX_MAGIC_LEN] = 0; if(VERBOSE){ std::cout << "# read magic number : '" << magic << "' == " << DARX_MAGIC << std::endl; } if(VERBOSE){ std::cout << "# " << magic[0] << magic[1] << magic[2] << magic[3] << std::endl; } if(strncmp(magic, DARX_MAGIC, DARX_MAGIC_LEN)){ return INVALID_STRUCT; } char magic2[4]; fread(&magic2, sizeof(char), 4, file); bool storedAsBE = ( magic2[3] == ((uint8_t)( DARX_MAGIC_BE&0xff))); darx.isBigEndian = storedAsBE; if(VERBOSE){ std::cout << "# file endianness ["<<magic2[3]<<" == " << ((uint8_t)(DARX_MAGIC_BE&0xff)) << "]: " << (storedAsBE ? "big" : "little") << std::endl; } int endianness_i = 0x00010203; bool systemIsBE = ( ((char*)&endianness_i)[0] == 0x00); if(VERBOSE){ std::cout << "# system endianness : " << (systemIsBE ? "big" : "little") << std::endl; } dtinfo.swapEndian = (systemIsBE == storedAsBE); if(dtinfo.swapEndian){ if(VERBOSE){ std::cout << "# need to swap endianness.." << std::endl; } } fread(&dtinfo.int_size, sizeof(uint8_t), 1, file); fread(&dtinfo.long_size, sizeof(uint8_t), 1, file); if(VERBOSE){ std::cout << "# data sizes [int:" << ((int)dtinfo.int_size) << ", long:" << ((long)dtinfo.long_size) << "]" << std::endl; } fread(&darx.number_of_tensors, sizeof(uint16_t), 1, file); if(VERBOSE){ std::cout << "# tensors : " << darx.number_of_tensors << std::endl; } long int *tensor_indices = new long int[darx.number_of_tensors]; assert(sizeof(long int) >= dtinfo.long_size); if(VERBOSE){ std::cout << "# tensor file locations : ["; } for(int i=0; i < darx.number_of_tensors; i++){ fread(&(tensor_indices[i]), dtinfo.long_size, 1, file); if(VERBOSE){ std::cout << tensor_indices[i] << " "; } } if(VERBOSE){ std::cout << "]" << std::endl; } fread(&darx.metadata_size, sizeof(uint16_t), 1, file); if(darx.metadata_size > 0){ if(VERBOSE){ std::cout << "# metadata size:" << darx.metadata_size << std::endl; } darx.metadata = new char[darx.metadata_size]; fread(&darx.metadata, 1, darx.metadata_size, file); } else { if(VERBOSE){ std::cout << "# no metadata (size:0)." << std::endl; } darx.metadata = 0; } if(VERBOSE){ std::cout << "# readin tensors ("<< darx.number_of_tensors <<")." << std::endl; } darx.tensors = new datatensor[darx.number_of_tensors]; for(int tensor_idx=0; tensor_idx < darx.number_of_tensors; tensor_idx++){ fseek(file, tensor_indices[tensor_idx], SEEK_SET); read_tensor(darx.tensors[tensor_idx], darx, file, dtinfo); } if(VERBOSE){ std::cout << "# darx file read successfully." << std::endl; } delete[] tensor_indices; return SUCCESS; }
void DataBuffer<DT>::read (const ParaFileData &pd) { if (pd.type == "tensor") read_tensor (pd); }