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

时间:2014-06-18 01:55:05

标签: c++ pointers c++11 struct casting

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

struct Color
{
    uint8 r;
    uint8 g;
    uint8 b;
    uint8 a;
};

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

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

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

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

1 个答案:

答案 0 :(得分:6)

  

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

像这样:

#pragma pack(push, 1)
struct Color
{
    uint8 r;
    uint8 g;
    uint8 b;
    uint8 a;
};
#pragma pack(pop)

uint8 bytearray[16];
...
Color *colorarray = reinterpret_cast<Color*>(bytearray);

然后你可以这样做:

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