C++ 将数据从struct二进制复制到std::vector

C++ 将数据从struct二进制复制到std::vector,c++,vector,binary-data,stdcopy,C++,Vector,Binary Data,Stdcopy,我正在使用一个可以从内存加载BMP图像的库 我有一个代表BMP的类 要从内存加载,我必须提供指向内存中某些BMP格式数据的指针和该数据大小的变量(无效*数据、大小和长度) 我想将数据存储在std::vector中。(避免手动内存管理) 我试图编写一个函数来返回一个std::vector,但我认为我得到的不是很好 std::vector<unsigned char> BMP::BITMAP::SaveMem() const { // memory storage st

我正在使用一个可以从内存加载BMP图像的库

我有一个代表BMP的类

要从内存加载,我必须提供指向内存中某些BMP格式数据的指针和该数据大小的变量<代码>(无效*数据、大小和长度)

我想将数据存储在
std::vector
中。(避免手动内存管理)

我试图编写一个函数来返回一个
std::vector
,但我认为我得到的不是很好

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::vector BMP::BITMAP::SaveMem()常量
{
//存储器
向量存储器;
BITMAPFILEHEADER f_head;
f_head.bfType=ushort_rev(((单词)“B”三个问题:

  • 您想复制字节,但函数提供了指向
    BITMAPFILEHEADER
    (或
    BitMapInfo Header
    )结构的指针。您需要将指针转换为字节,如
    重新解释转换(&f_head)

  • 前一个表达式导致了数据结尾的其他问题,表达式
    &f\u head+sizeof(f\u head)
    ,它实际上等于
    (&f\u head)[sizeof(f\u head)]
    ,远远超出了结构的结尾。在这里也需要使用字节,就像在
    重新解释强制转换(&f\u head)+sizeof f\u head
    中一样

  • 最后一个问题是调用的目的地,因为它需要与源类型类似,即指向
    uint8\u t
    (在我的cast中)的指针。您可以通过执行
    &内存[0]
    ,以及第二个调用
    &内存[sizeof f f_head]
    ,轻松地获得它


  • 改变设计有那么糟糕吗?因为这个错误的设计,修复一个bug需要多少时间?@JVApen它不理想,可能会引入更多的bug,因为有大量的代码依赖于在二进制级别操作BMP数据,他使用的是
    无符号字符
    uint8\u t
    f代码可能会假设这一点,但是否可以完全依赖于结构的每个字段都将直接从上一个字段开始,并且没有填充?我们是否可以确定
    sizeof(i_head)
    将不包含填充?@Galik IIRC这些结构的设计和布局都是为了避免填充,因为它们是(并且一直)用于从文件和向文件读写原始二进制。@Galik问得好:结构实际上有:
    \uuuu attribute\uuuuuu((打包))
    std::cooy的源和目标不必相似,它们都需要是迭代器。