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

时间:2016-02-27 09:44:39

标签: c arrays

我正在尝试将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之间)

2 个答案:

答案 0 :(得分:4)

无论机器上的字节顺序如何,下面的方法都会起作用(假设为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;

上面的代码以little endian方式将整数转换为字节数组。以下是link还有更多信息。

对于反向操作,请参阅答案here

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

答案 1 :(得分:3)

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

#include <stdio.h>

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]);
    }
}

请注意,数组中的值由于byte order而存储,即endianess。