2012-09-28 86 views
0

我的問題,我想轉換和DWORD類型的動態內存數組爲BYTE。公平的,我可以通過這個循環,並將DWORD轉換爲每個條目的BYTE。C++ DWORD * BYTE *

不過是他們一個更快的方式做到這一點?採取一個指向DWORD數據的指針並將整個數據段轉換爲指向BYTE數據的指針?如使用memcpy操作?

,我覺得這是不可能的,我不是要求的答案在我的做法只是有經驗的意見,因爲我已經嘗試測試了這兩種方法,但忽視了讓在我的第二個解決方案的解決方案。

感謝您的任何輸入,再沒有答案只是在正確的方向點。這也不是一個家庭作業問題,我覺得必須提及。

+0

這是什麼在這個數組? – nemasu

+0

是的,它是一個tga圖片文件。我試圖在我的程序中創建一個點,其中加載的所有圖像將處於相同的結構中。 – NomeSkavinski

回答

5

這真的取決於你想到底要達到什麼目的。如果你已經有了,e.g:

DWORD *x; 
x = new DWORD[100]; 

// x gets filled in somehow 

而你只是想處理每一個DWORD的每個字節分別然後做一些像你的建議(即使用例如memcpy的)可能是一種選擇。但是,您可以使用reinterpret_cast例如將數組作爲BYTE數組處理。

BYTE *y = reinterpret_cast<BYTE *>(x); 

或類似的東西。

+0

我完全忘了reinterpret_cast!我在數學課上使用了這個。這是我在編程時需要學習的東西,但我有很多東西需要測試才能知道何時以及如何使用這些東西。 – NomeSkavinski

+0

FWIW - 你也可以像@Necrolis提到的那樣使用static_cast(至少,這是值得一試的)。有相關類型的問題需要考慮。根據我的理解,BYTE和DWORD都不是C++定義的類型,所以可能是您使用的系統中的#define(可能是#define BYTE unsigned char,#define DWORD unsigned long或類似的東西)。因爲它們可能是__無符號static_cast應該工作。但是,如果一個人被簽名而另一個人不是,或者他們被定義爲不相關的類,那麼您可能會遇到static_cast問題,並且需要reinterpret_cast。 – cosimo193

0
DWORD array[10]; 
BYTE* byteArray = array; 
byteArray[0] .... 

是什麼?

+0

這是我原來的嘗試之一,但DWORD是4個BYTE,所以我認爲指針不能正確排列。但我真的appriciate你的迴應謝謝你 – NomeSkavinski

+0

取決於你想如何讀取雙字數組的數據。如果要將每個雙字轉換爲一個字節,則必須從4中讀取4個字節。byteArray [0]將成爲第一個字節,byteArray [4]第二個等等(或byteArray [3]和byteArray [7]取決於你的電腦架構是小端還是大端)。 –

+0

謝謝,那是我另一種可能幫助我的方法。我總是想象從DWORD而不是BYTE工作起來更容易,但兩者看起來都一樣好。我不知道爲什麼你的答案被拒絕。現在我將添加一個。 – NomeSkavinski

-1

如果DWORD和BYTE的長度相同,那麼肯定的。否則,不,您將需要單獨調整每個元素的大小。

+0

dword是4個字節,字節是一個:) –

+0

然後類型轉換將工作。 – L0j1k

1

如果你不關心可能交換字節順序的字節順序(如果你的字節順序很小),那麼你可以做static_cast<BYTE*>(array_ptr),如果你關心字節順序,你需要在字節交換之前運行思想手(字節交換有一個x86 intrinsic)。

如果你需要一個拷貝,然後就分配足夠的空間,做一個memcpy或與端修正副本循環。

+0

我想從OP的問題,他想調整每個DWORD ... – Benj

+0

@Benj:在這種情況下'數組[索引]&0xFF'會做他所需要的,但它並不真正清楚OP在嘗試什麼以實現... – Necrolis

+0

只要他意識到他可能截斷所有的價值,那麼它就可以工作...... – Benj