簡體   English   中英

C:將unsigned char數組轉換為signed int(反之亦然)

[英]C: Converting unsigned char array to signed int (vice versa)

我正在嘗試將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之間)

無論機器上的字節順序如何,下面的方法都可以工作(假設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方式將整數轉換為字節數組。 這里是鏈接還有更多信息。

有關反向操作,請參閱此處的答案。

使用memcpy的方法可能會在不同的計算機上提供不同的結果。 因為memcpy會將源地址中的任何內容復制到destionation,並且根據計算機是小端還是大端,可能在起始源地址處有一個LSB​​或MSB。

您可以將int (或unsigned int )和unsigned char數組存儲為union 這種方法稱為類型懲罰,並且自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]);
    }
}

請注意,由於字節順序 (即字節順序) ,存儲數組中的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM