iT邦幫忙

0

Arudino 16進位轉10進位

我用Arudino Serial取得一個byte
用for loop後
取得降冪的
id[3], id[2], id[1], id[0]
分別是38, 9A, 88, 81

請問要如何才能把38, 9A, 88, 81轉成=>
389A8881的10進位949651585呢

查一下進位的函數。一定有這個函數。找一下數值類。
ant1017 iT邦新手 3 級 ‧ 2020-09-18 14:22:06 檢舉
hex to dec in C
自己找...

2 個回答

2
最佳解答

https://ithelp.ithome.com.tw/upload/images/20200918/20106865R7MdY8qeMc.jpg

在採用小端序 (Little-Endian) 的機器上,降冪的陣列順序剛好和 int 資料存放的順序相同,可以直接用 int 的指標去取。

  • (unsigned int*)a:
    將陣列 a 的地址轉為 int 的指標
  • *(unsigned int*)a:
    將指標的值取出,由於是 int 型態,所以會抓取 4個 byte 的資料
#include <stdio.h>

int main()
{
    unsigned char a[4];
    a[0] = 0x81;
    a[1] = 0x88;
    a[2] = 0x9A;
    a[3] = 0x38;
    
    printf("%u", *(unsigned int*)a);

    return 0;
}

如果機器採用的 Endian 不確定的話,需要另外處理。

#include <stdio.h>

unsigned int toDec(unsigned char a[])
{
    //檢查機器是否採用小端序
    const unsigned short flag = 1;
    const unsigned char is_little_endian = 
        *((unsigned char*)&flag) == 1;
        
    if (is_little_endian)
        //小端序的話直接回傳
        return *(unsigned int*)a;
    else
    {
        //不是小端序則進行反轉
        unsigned char b[4];
        for(int i=0; i<4; i++)
            b[i] = a[4-i-1];
        return *(unsigned int*)b;
    }
}

int main()
{
    unsigned char a[4];
    a[0] = 0x81;
    a[1] = 0x88;
    a[2] = 0x9A;
    a[3] = 0x38;
    
    printf("%u", toDec(a));

    return 0;
}

發現可以直接用位移達到同樣的效果,而且不會有 Endian 的問題。

#include <stdio.h>

int main()
{
    unsigned char a[4];
    a[0] = 0x81;
    a[1] = 0x88;
    a[2] = 0x9A;
    a[3] = 0x38;
    
    unsigned int b = a[0] +
        (a[1] << 8 ) +
        (a[2] << 16) +
        (a[3] << 24) ;
        
    
    printf("%x", b);   //389a8881

    return 0;
}

感謝您 最後用位移運算符完成的

1
wrxue
iT邦新手 2 級 ‧ 2020-09-18 13:58:18

我是在VS C++內寫的,但概念都一樣,自行轉換即可
程式碼

#include <iostream>
int main()
{
	uint8_t id[4];
	id[3] = 0x38;
	id[2] = 0x9A;
	id[1] = 0x88;
	id[0] = 0x81;
	printf("%d", *(uint32_t*)id);
}

輸出

949651585
淺水員 iT邦研究生 4 級 ‧ 2020-09-18 16:11:58 檢舉

要考慮 endian 的問題,直接轉型的話有些機器是反過來的。

wrxue iT邦新手 2 級 ‧ 2020-09-18 16:27:00 檢舉

這就留給發問者自己發揮囉

我要發表回答

立即登入回答