簡體   English   中英

將存儲為字符的十六進制字符串轉換為C中的十進制

[英]Converting hex string stored as chars to decimal in C

我得到了一個字符串hex_txt,其中包含代碼中概述的4位十六進制數字,並分成兩個數組項。 我需要將其轉換為十進制。 以下是我的操作方式。

unsigned char hex_txt[] = "\xAB\xCD";
unsigned char hex_num[5];
unsigned int dec_num;

sprintf(hex_num, "%.2x%.2x", (int)hex_txt[0], (int)hex_txt[1]);
printf("%s\n", hex_num);
sscanf(hex_num, "%x", &dec_num);
printf("%d\n", dec_num);

有沒有更快或更有效的方法? 這是我目前的臨時解決方案,但我想知道是否有適當的方法來做到這一點。

int result = (unsigned char)hex_txt[0] * 256 + (unsigned char)hex_txt[1];

字符串hex_txt包含兩個字節。 我猜想順序是大端的(如果是小端的,則顛倒下標)。 hex_txt[0]的字符代碼為0xAB, hex_txt[1]的字符代碼為0xCD。 使用無符號字符轉換可確保您不會被帶符號的字符弄亂。

或者,一次完成所有操作:

printf("%d\n", (unsigned char)hex_txt[0] * 256 + (unsigned char)hex_txt[1]);

只需使用stdlib.h strtoul()函數。
請參見以下示例:

const char sHex[] = "AE";

unsigned char ucByte = 0;

ucByte = (unsigned char) strtoul(sHex, NULL, 16); //BASE 16 FOR HEX VALUES

這是我的工作:

n = 0;
while (*p){
    if (ISDIGIT(*p)) n = n*16 + (*p++ - '0');
    else if (ISALPHA(*p)) n = n*16 + (LOWERCASE(*p++) - 'a' + 10);
    else break;
}

而且(您會討厭這一點,但是它適用於ASCII)我作弊:

#define LOWERCASE(c) ((c) | ' ')

添加:對不起,我只是重新閱讀了您的問題。 為什么不這樣做:

(unsigned int)(unsigned char)p[0] * 256 + (unsigned int)(unsigned char)p[1]

我可能會胡言亂語,但如果您使用:

 char hex_txt[] = "\xAB\xCD";

那么實際上您只需定義2個字節:

 char hex_txt[] = {0xab, 0xcd};

因此要將其轉換為int可以執行以下操作:

 int number = (int) ((short *) *hex_text);

盡管我在這里發布了一段C ++代碼,但您可能不需要它。

暫無
暫無

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

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