[英]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.