返回int的第二个字节的地址或值

时间:2013-10-20 16:56:47

标签: c pointers

我声明了一个int并在c中赋值。在内存中,它看起来像以下

地址0x20002AD4

0x78 0x01 0x00 0x00

我需要从int的第一个和第二个字节中提取值。我已成功使用以下代码提取第一个字节(请参阅packet [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中第二个字节的值时(参见packet [3]),它会返回第4个字节。我相信这是因为int的大小是4个字节,所以地址上的+1会移动4个字节。

任何人都可以建议我如何在第二个字节中返回值,即在上面的示例中我想返回0x01

2 个答案:

答案 0 :(得分:1)

您想要解决 char 数组的元素,而不是将int视为数组:

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

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

答案 1 :(得分:1)

这是给出的代码的完整示例程序(经过修改以获取字节的第二部分):

#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。在其他架构上,字节可能会颠倒过来。