将无符号字节数组转换为Structs数组

sm8*_*095 2 c++ struct pointers casting c++11

使用C++(特别是GCC,应该更早地提出这个),我将原始纹理数据存储在RGBA格式的无符号字节数组中,每像素32位(每个颜色值8位,带Alpha,等等等等)向前...).问题是,我想编写一个函数,将原始数据作为一个Colors数组返回,其中Color是一个结构,定义如下:

struct Color
{
    uint8 r;
    uint8 g;
    uint8 b;
    uint8 a;
};
Run Code Online (Sandbox Code Playgroud)

加上函数和诸如此类的东西,但这些是结构中唯一的变量.我的想法是,由于每种颜色长度为4个字节,我可以以某种方式将原始字节数组转换为原始大小的1/4的Color数组(在数组的"长度"中,而不是绝对大小).我认为reinterpret_cast是我正在寻找的东西,但在谷歌搜索确认100%你可以将它转换为结构数组而不是只有一个结构后,我找不到任何东西.

所以我想我只是要求某人确认这确实是可能的reinterpret_cast,或者是否有不同的演员或方式来做到这一点.谢谢.

编辑:我的措辞有点奇怪,所以作为一个任意的例子,我想以某种方式将16个无符号字节的数组转换为4种颜色的数组.

编辑:我也知道它有点晚了,但我似乎无法找到如何使用reinterpret_cast在特定位置将一小部分数组转换为单个结构,如果可能的话,而不复制到较小的数组和那样的铸造.因此,对此问题的任何帮助也将不胜感激.

Rem*_*eau 6

作为一个任意的例子,我想以某种方式将16个无符号字节的数组转换为4种颜色的数组.

像这样:

#pragma pack(push, 1)
struct Color
{
    uint8 r;
    uint8 g;
    uint8 b;
    uint8 a;
};
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)

uint8 bytearray[16];
...
Color *colorarray = reinterpret_cast<Color*>(bytearray);
Run Code Online (Sandbox Code Playgroud)

然后你可以做这样的事情:

for (int idx = 0; idx < 4; ++idx)
{
    Color &c = colorarray[idx];
    // use c.r, c.g, c.b, c.a as needed...
}
Run Code Online (Sandbox Code Playgroud)

  • pragma是非标准的.位字段是标准的,但不能让你一路走下去:无法确保最后没有填充.然而,作为一个实际的事情,人们可以静态断言大小. (5认同)
  • 我就是这样做的.请注意,C++编译器不必支持`#pragma pack`,特定环境甚至可能不需要它.这取决于您希望解决方案的_standard_. (2认同)