我正在尝试将 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应该用什么方法?
方法一获取还是方法二获取? (或任何建议)
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));
虽然它工作正常但我不确定它是否正确或是否安全?
附言。我正在尝试通过 USB 串行通信在 2 个设备之间发送数据(在 Raspberry Pi 和 Arduino 之间)
最佳答案
无论机器上的字节序如何,下面的方法都有效(假设 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;
以上代码以小端方式将整数转换为字节数组。这是 link还有更多信息。
反向操作见答案here .
您使用 memcpy
的方法可能会在不同的计算机上产生不同的结果。因为 memcpy
会将源地址中的任何内容复制到目标位置,并且取决于计算机是小端还是大端,起始源地址可能有 LSB 或 MSB。
关于C:将 unsigned char 数组转换为 signed int(反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35668213/