1

我有一个 int 声明并在 c 中分配了一个值。在内存中看起来如下

0x78 0x01 0x00 0x00 在地址 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 中第二个字节的值时(请参阅 packet[3]),它反而会返回第 4 个字节。我相信这是因为整数大小为 4 个字节,因此地址上的 +1 会移动 4 个字节。

谁能建议我如何在第二个字节中返回值,即在上面的示例中我想返回 0x01

4

2 回答 2

1

您要处理char数组的元素,而不是将 int 视为数组:

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

packet[2] = p[0];
packet[3] = p[1];
于 2013-10-20T17:04:01.293 回答
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. 在其他架构上,字节可能会颠倒。

于 2013-10-20T17:06:05.277 回答