C++ 将数据从struct二进制复制到std::vector
我正在使用一个可以从内存加载BMP图像的库 我有一个代表BMP的类 要从内存加载,我必须提供指向内存中某些BMP格式数据的指针和该数据大小的变量<代码>(无效*数据、大小和长度) 我想将数据存储在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
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的源和目标不必相似,它们都需要是迭代器。