【发布时间】:2016-02-27 09:44:39
【问题描述】:
我正在尝试将无符号字符数组缓冲区转换为有符号整数(反之亦然)。
下面是演示代码:
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 之间)在 2 个设备之间发送数据
【问题讨论】:
-
不确定它是否安全,但减少不安全的一件事是说
unsigned char buf[sizeof(int)]而不是unsigned char buf[4]。 -
如果char数组没有正确对齐,方法1可能会导致segfault
-
num = *(int *)c不要那样做,c不需要正确对齐int -
好的,感谢您的所有建议!应该坚持 memcpy 方法!
-
*(int *)c也违反了严格的别名规则,不要这样做