将存储在向量中的二进制数据读入结构中

问题描述 投票:0回答:2

请考虑以下代码:

@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("FILEPATH", 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;
}

用简单的英语,代码将文件读取到类型为result的变量file_data,并返回它。

但是,我已经读取了文件的字节并将其存储在类型为std::vectorint8_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()方法提供更好的解决方案吗?

c++ stl
2个回答
1
投票

此外: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::stringstd::array<char, sizeof(file_data)>的工作原理类似


-1
投票

或以C方式:

file_data readData(const std::vector<char>& bytes) {
    file_data *result = (file_data *)bytes.data();
    return *result;
}
© www.soinside.com 2019 - 2024. All rights reserved.