将无符号字节数组强制转换为结构数组 使用C++(GCC专门地,应该早一点放),我将原始纹理数据存储在一个无符号字节数组中,以RGB格式,每像素32位(每色值8位,alpha,等等等等)。问题是,我想编写一个函数,以颜色数组的形式返回原始数据,其中颜色是定义如下的结构: struct Color { uint8 r; uint8 g; uint8 b; uint8 a; };

将无符号字节数组强制转换为结构数组 使用C++(GCC专门地,应该早一点放),我将原始纹理数据存储在一个无符号字节数组中,以RGB格式,每像素32位(每色值8位,alpha,等等等等)。问题是,我想编写一个函数,以颜色数组的形式返回原始数据,其中颜色是定义如下的结构: struct Color { uint8 r; uint8 g; uint8 b; uint8 a; };,c++,pointers,c++11,struct,casting,C++,Pointers,C++11,Struct,Casting,加上函数等等,但这些是结构中唯一的变量。我的想法是,由于每种颜色都有4个字节长,因此我可以以某种方式将原始字节数组转换为原始大小的1/4(以数组的“长度”表示,而不是以绝对大小表示)的颜色数组。我认为reinterpret_cast是我正在寻找的,但在谷歌搜索100%确认可以将其转换为一个结构数组而不是一个结构之后,我找不到任何东西 因此,我想我只是要求某人确认这确实可以通过reinterpret\u cast实现,或者如果有不同的cast或方法来实现这一点。谢谢 编辑:我的措辞有点奇怪,所以作

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

因此,我想我只是要求某人确认这确实可以通过
reinterpret\u cast
实现,或者如果有不同的cast或方法来实现这一点。谢谢

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

编辑:我也知道这有点晚了,但我似乎找不到如何使用reinterpret_cast(如果可能的话)将特定位置的数组的一小部分强制转换为单个结构,而不复制到较小的数组并进行类似的强制转换。因此,任何对这个问题的帮助都将不胜感激

作为一个任意示例,我想以某种方式将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\u cast(bytearray);
然后你可以这样做:

for (int idx = 0; idx < 4; ++idx)
{
    Color &c = colorarray[idx];
    // use c.r, c.g, c.b, c.a as needed...
}
for(int-idx=0;idx<4;++idx)
{
Color&c=colorarray[idx];
//根据需要使用c.r、c.g、c.b、c.a。。。
}

我会这样做。请注意,C++编译器不必支持< Cave>“PrimaPracePox< /Cord>”,而特定环境甚至可能不需要它。这取决于您希望解决方案的标准程度。pragma是非标准的。位字段是标准的,但并不能完全满足您的要求:无法确保末尾缺少填充。然而,作为一件实际的事情,我们可以静态地断言大小。@Praetorian我不是在指责这里的任何人这样想。我只是对我在各种帮助板上旅行时遇到的其他人进行了观察。此外,
uint8
没有指定标准类型,你可能会因为你试图做的事情而受到影响。您应该非常清楚您必须应用的是什么,否则您的冰箱可能会爆炸或发生任何其他意外(=未定义)行为!!您只需排除所有其他类型的强制转换,即可获得“reinterpret_cast”选项。Const_cast、static_cast和dynamic_cast在您的案例中肯定不起作用。抱歉,应该更具体一些。我有一个全局include文件,它将uint8定义为
uint8\u t
,它在GCC中定义为
unsigned char
,我正在使用GCC。
for (int idx = 0; idx < 4; ++idx)
{
    Color &c = colorarray[idx];
    // use c.r, c.g, c.b, c.a as needed...
}