[英]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 char
的typedef
。 在這里,我將使用<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.