2014-06-18 110 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

相關問題