2013-10-20 28 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];