C:将unsigned char数组转换为signed int(反之亦然)

我正在尝试将unsigned char数组缓冲区转换为signed int(反之亦然)。

以下是演示代码:

int main(int argv, char* argc[]) { int original = 1054; unsigned int i = 1054; unsigned char c[4]; int num; memcpy(c, (char*)&i, sizeof(int)); //num = *(int*) c; // method 1 get memcpy((char *)&num, c, sizeof(int)); // method 2 get printf("%d\n", num); return 0; } 

1)我应该使用哪种方法从unsigned char []到int?

方法1得到或方法2得到? (或任何建议)

2)如何将int原始转换为unsigned char []?

我需要通过只接受unsigned char []的缓冲区发送这个整数

目前我正在做的是将int转换为unsigned int然后转换为char [],例如:

 int g = 1054; unsigned char buf[4]; unsigned int n; n = g; memcpy(buf, (char*)&n, sizeof(int)); 

虽然它工作正常,但我不确定它是正确的方式还是安全的?

PS。 我正在尝试通过USB串行通信在两个设备之间发送数据(在Raspberry Pi和Arduino之间)

您可以将int (或unsigned int )和unsigned char数组存储为union 。 这种方法称为类型惩罚,并且自C99以来它被标准完全消毒(尽管之前是常见的做法)。 假设sizeof(int) == 4

 #include  union device_buffer { int i; unsigned char c[4]; }; int main(int argv, char* argc[]) { int original = 1054; union device_buffer db; db.i = original; for (int i = 0; i < 4; i++) { printf("c[i] = 0x%x\n", db.c[i]); } } 

请注意,由于字节顺序 (即字节顺序) ,存储数组中的值。

无论机器上的字节顺序如何,下面的方法都可以工作(假设sizeof(int)==4 ):

 unsigned char bytes[4]; unsigned int n = 45; bytes[3] = (n >> 24) & 0xFF; bytes[2] = (n >> 16) & 0xFF; bytes[3] = (n >> 8) & 0xFF; bytes[0] = n & 0xFF; 

上面的代码以小端方式将整数转换为字节数组。 这里是链接还有更多信息。

有关反向操作,请参阅此处的答案。

使用memcpy的方法可能会在不同的计算机上提供不同的结果。 因为memcpy会将源地址中的任何内容复制到destionation,并且根据计算机是小端还是大端,可能在起始源地址处有一个LSB​​或MSB。