двоичное копирование данных из структуры в std :: vector

Я использую библиотеку, которая может загружать изображения BMP из памяти.

У меня есть класс, который представляет BMP.

Для загрузки из памяти я должен предоставить указатель на некоторые данные в формате BMP в памяти и переменную для размера этих данных. (void* data, size_t length)

Я хочу хранить свои данные в std::vector, (Избегает ручного управления памятью)

Я пытался написать функцию для возврата std::vector<unsigned char>, но я не думаю, что у меня есть очень хорошо.

std::vector<unsigned char> BMP::BITMAP::SaveMem() const
{

// memory storage
std::vector<unsigned char> memory;BITMAPFILEHEADER f_head;
f_head.bfType = ushort_rev(((WORD)'B' << 0x08) | ((WORD)'M' << 0x00));
f_head.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + m_width_memory * m_height;
f_head.bfReserved1 = 0;
f_head.bfReserved2 = 0;
f_head.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);// build standard bitmap file header
BITMAPINFOHEADER i_head;
i_head.biSize = sizeof(BITMAPINFOHEADER);
i_head.biWidth = m_width;
i_head.biHeight = m_height;
i_head.biPlanes = 1;
i_head.biBitCount = m_bit_count;
i_head.biCompression = 0;
i_head.biSizeImage = m_width_memory * m_height;
i_head.biXPelsPerMeter = 0;
i_head.biYPelsPerMeter = 0;
i_head.biClrUsed = 0;
i_head.biClrImportant = 0;// alloc
memory.resize(f_head.bfSize);

std::copy(&f_head, &f_head + sizeof(f_head), memory.at(0));
std::copy(&i_head, &i_head + sizeof(i_head), memory.at(0) + sizeof(f_head));// write data
for(unsigned int y = 0; y < m_height; ++ y)
{
std::copy(&m_data[y * m_width_memory], m_data[y * m_width_memory + 3 * m_size_x], memory.at(0) + sizeof(f_head) + sizeof(i_head));
}

}

Очевидно, что это не компилируется. Я не могу придумать никакой альтернативы std::copy, Это действительно правильный инструмент для работы?

Чтобы сделать его компиляцией, я думаю, что я должен изменить memory.at(x) в memory.data() + x… Делая это, я буду использовать сырые указатели — вот почему я не думаю, std::copy лучше чем memcpy,

Могу я дать совет по этому поводу? Это несколько нелогичная задача, и если бы я знал об этом требовании раньше, я бы сохранил свои данные пикселей в unsigned char с заголовками растрового файла, предшествующими данным. К сожалению, сейчас будет очень сложно изменить дизайн, поэтому я бы не стал его трогать.

0

Решение

Три проблемы:

  1. Вы хотите скопировать байтов, но std::copy Функция предоставляется указатель на BITMAPFILEHEADER (или же BITMAPINFOHEADER) состав. Вам нужно конвертировать указатели в байтов, лайк reinterpret_cast<uint8_t*>(&f_head),

  2. Предыдущее приводит к другим проблемам с окончанием данных, выражением &f_head + sizeof(f_head) который действительно равен (&f_head)[sizeof(f_head)]и далеко за пределами структуры. Вам нужно использовать байты и здесь, и в reinterpret_cast<uint8_t*>(&f_head) + sizeof f_head,

  3. Последняя проблема — пункт назначения для std::copy вызов, так как он должен быть похож на тип источника, то есть указатель на uint8_t (в случае моих слепков). Вы можете легко получить это, сделав, например, &memory[0], И для второго звонка &memory[sizeof f_head],

1

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

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

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