簡體   English   中英

在 C 中將十六進制值轉換為十進制值

[英]Converting a HEX value to DECimal value in C

我已經從 SO 中嘗試了很多想法。 當我在這里對其進行測試時,其中一個有效(HEX 31 的輸出為 DEC 49)。 但是,當我在我的應用程序中實現它時,它並沒有產生相同的結果。 (輸出是 31 又是 31)。

這個想法是使用一個字符串值(充滿十六進制對); 一個例子; 313030311b5b324a1b5b324a534f495f303032371b

我需要將每個 integer 對(HEX)轉換為等效十進制值。 例如

HEX => DEC
31  => 49
30  => 48

然后,我將使用 UART 逐個值發送 DEC 值。

我測試行為的代碼在下面和這里 但是,它不一定是那個代碼,只要它能完成工作,我願意接受所有建議。

#include <stdio.h>
    
int isHexaDigit(char p) {
    return (( '0' <= p && p <= '9' ) || ( 'A' <= p && p <= 'F'));
}
    
int main(int argc, char** argv) 
{ 
    char * str = "31";
    char t[]="31";
    char* p = t;
    char val[3]; // 2 hexa digit 
    val[2] = 0;  //and the final \0 for a string
    int number; 
        
    while (isHexaDigit(*p) && isHexaDigit(*(p+1))) {
        val[0] = *p;
        val[1] = *(p+1);
    
        sscanf(val,"%X", &number);    // <---- Read hexa string into number
        printf("\nNum=%i",number);    // <---- Display number to decimal.
                  
        p++;
        //p++;
        if (!*p) break;
        p++;
    }
    return 0; 
} 

編輯我最小化了代碼。 奇數字符串暫時被忽略。 代碼逐字節發送數據。 在終端應用程序中,我將值作為 HEX,例如 HEX 31 而不是 DEC 49。它們實際上是相同的。 但是,我使用的設備需要 DEC 49 版本的值(即 ASCII = 1)

在此處輸入圖像描述

任何指針高度贊賞。

您可以使用strtol function 將十六進制字符串轉換為二進制,然后在一行中將其轉換為十進制字符串:

snprintf(str_dec, 4, "%ld", strtol(str_hex, NULL, 16));

您的代碼變為:

#include <stdio.h>
#include <stdlib.h>

int isHexaDigit(char p) {
    return (( '0' <= p && p <= '9' ) || ( 'A' <= p && p <= 'F'));
}

int main(int argc, char** argv)
{
    char * str = "31";
    char t[]="31";
    char* p = t;

    char str_hex[3] = {0,};
    char str_dec[4] = {0,};

    while (isHexaDigit(*p) && isHexaDigit(*(p+1))) {

        str_hex[0] = *p;
        str_hex[1] = *(p+1);

        /* Convert hex string to decimal string */
        snprintf(str_dec, 4, "%ld", strtol(str_hex, NULL, 16));

        printf("str_dec = %s\n", str_dec);

        /* Send the decimal string over UART1 */
        if (str_dec[0]) UART1_Write(str_dec[0]);
        if (str_dec[1]) UART1_Write(str_dec[1]);
        if (str_dec[2]) UART1_Write(str_dec[2]);

        /* Reset str_dec variable */
        str_dec[0] = 0;
        str_dec[1] = 0;
        str_dec[2] = 0;

        p++;
        if (!*p) break;
        p++;
    }
    return 0;
}

暫無
暫無

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

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