Чтение двоичных данных, хранящихся в векторе, в структуру - PullRequest
0 голосов
/ 14 января 2020

Рассмотрим следующий код:

#pragma pack(2)

struct file_data {
  uint8_t data0;
  uint16_t data1;
  uint8_t data2;
}

#pragma pack()

file_data readFile(const std::string& pathFile) {
  file_data result;

  std::ifstream(pathFile, std::ios::in | std::ios::binary);
  if(!file.is_open()) return file_data();

  file.read(reinterpret_cast<char*>(result), sizeof(file_data));
  file.close();

  return result;
}

int main(int argc, char* argv[]) {
  file_data = readFile("the/path/to/the/file");

  return 0;
}

В простом Engli sh код считывает файл в переменную result типа struct file_data и возвращает его.

Однако, скажем, я уже прочитал байты файла и сохранил их в std::vector типа int8_t. Затем я хочу записать эти данные в экземпляр file_data. Я не хочу делать это поле за полем, так как структура может измениться.

Это был мой обходной путь:

file_data readData(const std::vector<int8_t>& bytes) {
  std::stringstream ss;
  for(int8_t byte : bytes) ss.write(reinterpret_cast<const char*>(&byte), sizeof(int8_t));

  file_data result;
  ss.read(reinterpret_cast<char*>(&result), sizeof(file_data));

  return result;
}

Итак, сначала вектор записывается обратно в поток, затем прочитайте в структуре.

Я чувствую, что это крайне неэффективно, и есть некоторые знания, которые мне здесь не хватает. Может кто-нибудь предложить лучшее решение для моего readData() метода?

1 Ответ

2 голосов
/ 14 января 2020

В стороне: int8_t может не быть char, вы должны использовать его вместо.

file_data readData(const std::vector<char>& bytes) {
  file_data result;
  std::copy_n(bytes.data(), sizeof(file_data), reinterpret_cast<char*>(&result));
  return result;
}

Это работает аналогично с std::string и std::array<char, N> (для N >= sizeof(file_data))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...