2014-06-18 45 views
2

使用C++(具体来说,应该把这个更早),我将原始纹理数据存储在无符号字节数组中,以RGBA格式存储,每像素32位(8使用Alpha的每个颜色值的位数,等等等等......)。关键是,我想写一个返回原始数据作为阵列的色彩,其中一个颜色定义为下面的一个结构的函数:将无符号字节数组转换为Structs数组

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

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

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

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

编辑:另外我知道它有点晚了,但我似乎无法找到如何将数组的一小部分在一个特定的地方使用reinterpret_cast铸造到一个单一的结构,如果这是可能的,而不需要复制到一个更小的阵列并像这样投射。所以对这个问题的任何帮助也将不胜感激。

+0

除了'uint8'没有指定标准型,你可能会因为你想要做的事而成为_padding_的受害者。你应该非常确定你必须申请一个'reinterpret_cast <>',否则你的冰箱可能爆炸或者可能发生任何其他意外(==未定义)的行为! –

+0

您可以通过简单排除所有其他类型的演员来到达“reinterpret_cast”选项。 Const_cast,static_cast和dynamic_cast在你的情况下肯定不起作用。 – Oleg

+0

抱歉应该更具体。我有一个全局包含文件,它将uint8定义为'uint8_t',它在GCC(也可能是其他人,但我只使用GCC)中定义为'unsigned char',我使用GCC。 – sm81095

回答

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... 
} 
+2

我就是这么做的。请注意,C++编译器不必支持'#pragma pack',并且特定的环境可能不需要它。这取决于你想要你的解决方案的标准。 –

+5

这些编译指示是非标准的。位字段是标准的,但不能完全让你满意:没有办法确保最终没有填充。然而,作为一个实际的东西,人们可以静态断言大小。 –

+0

@Praetorian我并没有指责任何人这么想。我只是对我在各种帮助板上旅行时遇到的其他人进行观察。 – sm81095

相关问题