C++ 可移植地将数据打包到缓冲区

C++ 可移植地将数据打包到缓冲区,c++,C++,我必须将几个整数值放入(32字节)缓冲区,每个整数值必须位于缓冲区中的特定位置(我将使用OpenGL VBOs中的数据) 我现在这样做有点难看。所有内容都应该放在地址buf2处。不要看我分配给缓冲区的值,因为这些值与问题无关 uint32_t *const coords = reinterpret_cast<uint32_t *>(buf2 + CoordDataOff); uint16_t *const texcoords = reinterpret_

我必须将几个整数值放入(32字节)缓冲区,每个整数值必须位于缓冲区中的特定位置(我将使用OpenGL VBOs中的数据)

我现在这样做有点难看。所有内容都应该放在地址buf2处。不要看我分配给缓冲区的值,因为这些值与问题无关

    uint32_t *const coords      = reinterpret_cast<uint32_t *>(buf2 + CoordDataOff);
    uint16_t *const texcoords   = reinterpret_cast<uint16_t *>(buf2 + TcoordDataOff);
    uint32_t *const color       = reinterpret_cast<uint32_t *>(buf2 + ColorDataOff);

    coords[0] = x + bearing[0]; // left
    coords[1] = y + bearing[1] - 64*(tcoords[3] - tcoords[1]); // bottom
    coords[2] = x + bearing[0] + 64*(tcoords[2] - tcoords[0]); // right
    coords[3] = y + bearing[1]; // top
    copy_n(tcoords, 4, texcoords);
    *color = c.color;
uint32*const coords=reinterpret\u cast(buf2+CoordDataOff);
uint16*const texcoords=重新解释转换(buf2+TCoordataoff);
uint32*const color=重新解释强制转换(buf2+COLORDATOFF);
坐标[0]=x+方向角[0];//左边
坐标[1]=y+方向角[1]-64*(T字[3]-T字[1]);//底部
坐标[2]=x+方向角[0]+64*(T字词[2]-T字词[0]);//正确的
坐标[3]=y+轴承[1];//顶部
复印件(t字、4字、texcoords);
*颜色=c.颜色;

有没有更好的、可移植的方法来实现它?

您的缓冲区是否只包含每个顶点的数据?您可以生成一个结构

struct TData
{
  uint32_t coords[4];
  uint16_t texcoords[4];
  uint32_t color;
};
然后,它将像处理TData数组一样简单

TData verts[100];
vert[0].coord[0] = x;
vert[0].coord[1] = y;
...
FunctionToWriteToBuffer((void *)verts, sizeof(TData) * 100);
或者在上面的代码中

  TData *vert = (TData *)buf2;

这也会使维护起来更容易阅读

您的
结构可能会在
texcoords
之前或之后插入2个字节的填充。C++标准没有指定在哪里。您可以显式添加填充,但由于OP的未指定内存限制,它可能无法工作。抱歉,是的,我在键入答案时考虑了#pragma pack(),但忘了包含它。你这样做是非常重要的。我粘贴的最后一行代码应该可以在问题中使用(取决于CoordDataOff、TcordDataOff、ColorDataOff的值)。但我想有一些类似的代码将填充VBO。使用相同的结构读取和写入缓冲区会使事情更容易。pragma pack会导致颜色字段不对齐,这可能会导致访问此类变量时ARM处理器上的数据中止。与其使用单一结构,不如将每种类型的coords、tex、color保留在单独的数组中,然后用OGL@luskan由于代码的其他部分,拥有每种属性类型都会非常不方便,所以这不是一个选项。我宁愿保持当前的方式。如果我正确理解您当前的解决方案,那么它仍然会导致ARM上的数据中止。若大缓冲区中texcoords条目的数量为奇数,则颜色条目将从未对齐的地址开始。