2013-10-20 48 views
1

我有一個int聲明並在c中賦值。在內存方面,它看起來像下面返回int的第二個字節的地址或值

0x78 0×01 0×00 0×00地址0x20002AD4

我需要從INT的第一和第二個字節提取值。我已成功用下面的代碼(參見包[2])

int dataSize = (lightCount * 3) + 1; 
unsigned char packet[totalSize]; 

packet[0] = 0x7E; 
packet[1] = 0x06; 
packet[2] = (unsigned char)*(&dataSize); //dataSize LSB - THIS WORKS 
packet[3] = (unsigned char)*(&dataSize + 1); //dataSize MSB - THIS DOES NOT 

然而,當我嘗試使用指針運算在int作爲第二個字節返回的值(參見包[3提取的第一字節]),而是返回第4個字節。我相信這是由於int的大小爲4字節,所以地址上的+1會沿着4個字節移動。

任何人都可以建議我怎麼能在第二個字節返回值,即在上面的例子中我想回到0×01

+3

小心Endianness。 – Sadique

+2

您必須將指針轉換爲char,而不是指向int的指針。試試'((unsigned char *)&dataSize)[0]'(分別爲1)。 – 2013-10-20 17:00:05

+2

@Acme這不是問題的根源。 – 2013-10-20 17:01:56

回答

1

下面是給出的代碼的一個完整的示例程序(經修飾以獲得字節的第2部分):

#include <stdio.h> 

int main() { 
    int dataSize = 0x7E06; 
    unsigned char packet[4]; 

    packet[0] = 0x7E; 
    packet[1] = 0x06; 
    packet[2] = (unsigned char)dataSize; 
    packet[3] = *(((unsigned char*)&dataSize) + 1); 

    printf("%d, %d, %d, %d\n", packet[0], packet[1], packet[2], packet[3]); 
} 

在我的電腦上,這會輸出126, 6, 6, 126。在其他體系結構中,字節可能會顛倒。

1

你想解決焦炭數組中的元素,不能治療INT爲陣列:

unsigned char const * p = (unsigned char const *)&dataSize; 

packet[2] = p[0]; 
packet[3] = p[1];