2011-11-23 82 views
0

我是新來的指針,我想做一個函數,使得從int變量的內存中的每個字節添加到unsigned char中的每個單元格。請參見下面C++中的指針和字節數組

int main() 
{ 
unsigned char buffer[4] = {0}; 
int number = 15 
unsigned char *ptBuffer = &buffer; 

return 0; 
} 

代碼,以便輸出將

buffer[0]= 0, 
buffer[1]= 0, 
buffer[2]= 0, 
buffer[3]= F 

所以

number = 15 => 0x000F 

回答

0

雖然你在做什麼似乎有些沒有意義的,聞起來像功課,這裏就是你可以做。

#include <iomanip> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    unsigned char buffer[sizeof(int)]; 
    int i, number=15; 

    for (i=0; i < (int)sizeof(buffer); i++, number >>= 8) { 
     buffer[sizeof(buffer)-i-1]=number&0xff; 
    } 

    for (i=0; i < (int)sizeof(buffer); i++) { 
     std::cout << std::hex << std::setw(2) 
        << std::setfill('0') 
        << int(buffer[i]) << ' '; 
    } 
    std::cout << std::endl; 

    return 0; 
} 
+0

這將創建一個小端機器上不正確的輸出。 – GWW

+0

當然,取決於字節順序,字節順序將會顛倒,但這就是它在內存中的佈局。這個問題留下了很多解釋他想要的空間。 – hochl

+0

因此,你的解決方案是不便攜的 – GWW

3

不依賴於混疊(這可能會煩擾優化器)的便攜式解決方案是使用一些比特操作C++提供的。如果你確信整數需要你的機器上的4個字節(但在生產代碼,你真的不應該承擔這一點,作爲一個整數的大小是不明確的),它會是這樣的:

int x = ...; 

unsigned char bytes[4] = { 
    (x >> 24) & 0xFF, 
    (x >> 16) & 0xFF, 
    (x >> 8) & 0xFF, 
    (x >> 0) & 0xFF, 
}; 

>>被逐位右移。的&是按位ANDS(1和0 = 0,1和l = 1,0和1 = 0)。

你後輸出例如通過std::cout << (int)bytes[0] << ...

0
unsigned char buffer[4] = {0}; 
int number = htonl(15); 
unsigned char *ptBuffer = &buffer[0]; 
*(int*)ptBuffer = *(int*)&number; 

會給你緩衝液[0] = 0,緩衝液[1] = 0,緩衝液[2] = 0,緩衝液[3] = 15

它也可以與此代碼完成的:

int number = 15; 
unsigned char buffer[4] = {0}; 
__asm mov eax, number 
__asm bswap eax 
__asm mov dword ptr buffer, eax 

然後,你可以這樣定義它:

#define SWAP(val,buf) __asm mov eax, val \ 
         __asm bswap eax \ 
         __asm mov dword ptr buf, eax 

,並調用它像:

int number = 15; 
unsigned char buffer[4] = {0}; 
SWAP(number, buffer); 
+0

這不會給一個小端機上正確的輸出。 – GWW

+0

hehe ...'htonl()'FTW! – hochl

0

你的問題有點不清楚,但我的理解是,你想填補字符數組與組成一個int的字節數。請注意,您將得到的結果將是依賴於平臺...即大端機器上,你會得到

buffer[0]= F, buffer[1]= 0, buffer[2]= 0, buffer[3]= 0. 

要做到這一點的方法有很多,但最pedagological在這種情況下,我認爲將是以下內容:

void read_int(unsigned char *results, int num) { 
    int count = 0; 
    char *num_bytes=(char*)&num; 
    for (count=0; count<sizeof(int); count++) { 
     results[count]=num_bytes[count]; 
    } 
} 
int main() { 
    unsigned char buffer[4] = {0}; 
    int number = 15; 

    read_int(buffer, number); 
    return 0; 
} 

注意如何可以投一個類型的指針指向另一個指針,以及如何使用像數組的指針,並像一個指針數組。

+0

我應該在小端機器上改變什麼? –

0

我有一種感覺,我可能是錯的,因爲我會認爲這會已經提到已如果它的工作,但是這聽起來像使用union的好地方。

union IntBytes 
{ 
    int intVal; 
    unsigned char byteVal[sizeof(int)]; 
}; 

IntBytes foo; 
foo.intVal = 15; 
// now access foo.byteVal[0], [1], etc. 

我認爲這應該是合法的,我期望它達到預期的效果。