簡體   English   中英

如何串聯字節數組並轉換為十進制?

[英]How concatenate array of bytes and convert to decimal?

例如,如何連接字節?

我有一個字節數組,BYTE * buffer [2] = [0x00,0x02],但是我想將這兩個字節連接起來,但是要倒過來。

這樣的東西

0x0200 <---

然后將這些字節轉換為十進制0x0200 = 512

但我不知道如何在C上執行此操作,因為由於緩沖區是BYTE而不是CHAR,我無法使用memcpy或strcat,甚至不知道我是否可以這樣做

有人可以為我提供代碼幫助嗎,或者如何將字節連接起來以十進制轉換?

因為我還有另一個字節數組,所以buff = {0x00、0x00、0x0C,0x00、0x00、0x00},並且需要這樣做。

請幫助。 問候。

BYTE不是標准類型,可能是unsigned chartypedef 在這里,我將使用<stdint.h>中的定義,這些定義為指定的字節寬度(其中一個字節為uint8_t定義整數。

考慮一下,將兩個字節“向后”連接起來很容易:

uint8_t buffer[2] = {0x00, 0x02};
uint16_t x = buffer[1] * 256 + buffer[0];

順便說一下,它不是反向的,而是Little Endian字節順序。 相反的是Big Endian,最高有效字節在前:

uint16_t x = buffer[0] * 256 + buffer[1];

然后,就沒有“轉換為十進制”之類的東西。 在內部,所有數字均為二進制。 您可以將它們打印為十進制數字或十六進制數字,也可以打印為任何底數,甚至可以打印為羅馬數字,但是仍然是相同的數字:

printf("dec: %u\n", x);    // prints 512
printf("hex: %x\n", x);    // prints 200

現在,讓我們看一下任何長度的字節數組會發生什么:

uint8_t buffer[4] = {0x11, 0x22, 0x33, 0x44};
uint32_t x = buffer[3] * 256 * 256 * 256
           + buffer[2] * 256 * 256 
           + buffer[1] * 256 
           + buffer[0];

看到圖案了嗎? 您可以將其重寫為:

uint32_t x = ( ( (buffer[3]) * 256 
                + buffer[2]) * 256 
                + buffer[1]) * 256 
                + buffer[0];

您可以輕松地將此邏輯轉換為函數:

uint64_t int_little_endian(uint8_t *arr, size_t n)
{
    uint64_t res = 0ul;

    while (n--) res = res * 256 + arr[n];

    return res;
}

同樣對於Big Endian,當您“向前”移動時:

uint64_t int_big_endian(uint8_t *arr, size_t n)
{
    uint64_t res = 0ul;

    while (n--) res = res * 256 + *arr++;

    return res;
}

最后,處理字節轉換的代碼通常不使用乘法和加法的算術運算,而是使用所謂的按位運算符。 通過將數字的所有位右移一位來表示與2的乘積。 (就像十進制乘以10一樣,是通過將所有數字都加1並附加一個零來完成的。)乘以256將變成左移8個字節的位,其i表示法是x << 8

通過按位或進行加法。 這兩個操作不完全相同,因為按位運算或按位運算並且不考慮進位。 在我們的情況下,添加之間沒有沖突,它們的行為相同。 現在,您的Little-Endian轉換函數如下所示:

uint64_t int_little_endian(uint8_t *arr, size_t n)
{
    uint64_t res = 0ul;

    while (n--) res = res << 8 | arr[n];

    return res;
}

而且如果那看起來不像是一些漂亮的C代碼,我也不知道。 (如果這些按位運算符使您感到困惑,請暫時不要使用它們。在您的示例中,乘法和加法很好。)

暫無
暫無

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

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