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

标签 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应该用什么方法?

方法一获取还是方法二获取? (或任何建议)

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/

相关文章:

c - 不同的 SHA-256 哈希值取决于输入是使用 sizeof 还是 strlen 测量

c - 可以使用 strcpy() 将 malloc 数组复制到 C 中的堆栈数组吗?

arrays - 在 Swift 中转换 [UInt32] -> [UInt8] -> [[UInt8]]

c++ - 防止数组元素的默认构造

java - 在数组中创建 JButton 时出错

C rename() FileNotFound 尽管文件存在

c - 使用 C 在文件中垂直查找数据

没有互斥量的条件等待

php - 防止PHP中变量数组的SQL注入(inject)

javascript - 如何循环遍历 d3 中的内部值数组并添加相应的子元素?