我声明了一个int并在c中赋值。在内存中,它看起来像以下
地址0x20002AD40x78 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
答案 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
。在其他架构上,字节可能会颠倒过来。