2 seanbei seanbei 于 2014.11.19 16:53 提问

C语言中如何把字符串"2A"转换成0x2A?

如题:C语言中如何把字符串"2A"转换成0x2A?
有没有现成的函数,或者提供一直转换思路?

8个回答

91program
91program   Ds   Rxr 2014.11.19 17:42
已采纳

思路:对字符串中每个字符判断是 0 到 9,还是 A 到 F
对这两种情况进行处理,是第一种减去 0x30 就是对应的数字;第二种减去 'A',再加上 10。如果字母有小写的情况,也需要考虑。

BTNZF
BTNZF 回复seanbei: 可以查一下,ASCII码表,‘A'的十六进制为0x41, ‘a'的十六进制为0x61,请知道一下,另外10,在没有说明的情况是十进制的。
接近 3 年之前 回复
seanbei
seanbei 第二种减去0x31就是了,哈哈
接近 3 年之前 回复
caozhy
caozhy   Ds   Rxr 2014.11.19 19:00

思路,手写的。
int result = 0;
for (int i = 0; i < strlen(s); i++)
{
result += (s[i] < '0' ? s[i] - 'A' + 10 : s[i] - '0') << (strlen(s) - 1 - i) * 4;
}

seanbei
seanbei 回复BTNZF: 正解!
接近 3 年之前 回复
BTNZF
BTNZF https://code.csdn.net/snippets/525598/master/hexstr2hex.txt/raw
接近 3 年之前 回复
BTNZF
BTNZF <script src="https://code.csdn.net/snippets/525598.js"></script>
接近 3 年之前 回复
BTNZF
BTNZF 我对这个问题的理解为,将字符串表示的十六进制,转换为相应的二进制数据。 前提: 1、"2A",这样的字符串,是以ASCII码的形式进行编码的; 2、字符串中,只允许出 现:'0','1','2','3','4','5','6','7','8','9','a','A','b','B','c','C','d','D','e','E','f','F'这些字符,以'\0'结尾; 3、输入的字符串的长度大于0. 转换的思路为:
接近 3 年之前 回复
91program
91program   Ds   Rxr 2014.11.19 17:38

atoi 得到数字,十六进制就是想要的结果

91program
91program   Ds   Rxr 2014.11.19 17:38

atoi 得到数字,十六进制就是想要的结果

91program
91program   Ds   Rxr 2014.11.19 17:39

搞错了,还回了两次,真是晕啊!

没有现成的函数,自己写吧,很简单。

BTNZF
BTNZF   2014.11.20 14:19

/*
return 16 error!
/
unsigned char hexchar2hex(char hexchar){
switch(hexchar){
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'A': return 10;
case 'a': return 10;
case 'B': return 11;
case 'b': return 11;
case 'C': return 12;
case 'c': return 12;
case 'D': return 13;
case 'd': return 13;
case 'E': return 14;
case 'e': return 14;
case 'F': return 15;
case 'f': return 15;
default: return 16;
}
}
/

return 16 error!
*/
unsigned char hexchar2hex(char hexchar){
if(isdigit(hexchar)){
return hexchar - '0';
}
if(islower(hexchar) && hexchar < 'g'){
return hexchar - 'a' + 10;
}
if(isupper(hexchar) && hexchar < 'G'){
return hexchar - 'A' + 10;
}
return 16;
}

/*
return -1 error!
return 1 succ
*/
int hexstr2hex(char *hexstrp, char **ret_hex, int *ret_len){
int len;
int hex_low;

if(hexstrp == NULL || hexstrp[0] == '\0' || *ret_hex != NULL || ret_len == NULL){
    return -1;
}

len = strlen(hexstrp);
*ret_len = (len-1)/2 + 1;
*ret_hex = (char *)malloc(*ret_len);
if(*ret_hex == NULL){
    return -1;
}
memset(*ret_hex, 0, *ret_len);
for(i = 0; i < len; i++){
    if((hex_low = hexchar2hex(hexstrp[len - 1 - i])) == 16){
        free(*ret_hex);
        *ret_hex = NULL;
        return -1;
    }
    (*ret_hex)[i/2] = hex_low;
    i++;
    if(i < len){
        if(hex_low = hexchar2hex(hexstrp[len - 1 - i])) == 16){
            free(*ret_hex);
            *ret_hex = NULL;
            return -1;
        }
        (*ret_hex)[i/2] = (*ret_hex)[i/2] + (hex_low * 16);
    }
}
return 1;

}

BTNZF
BTNZF 这个代码,没有经过测试。
接近 3 年之前 回复
BTNZF
BTNZF 这个代码,没有经过测试。
接近 3 年之前 回复
BTNZF
BTNZF   2014.11.23 23:40

#include
#include
#include

/*
return 16 error!
*/
unsigned char hexchar2hex(char hexchar){
if(isdigit(hexchar)){
return hexchar - '0';
}
if(islower(hexchar) && hexchar < 'g'){
return hexchar - 'a' + 10;
}
if(isupper(hexchar) && hexchar < 'G'){
return hexchar - 'A' + 10;
}
return 16;
}

/*
return -1 error!
return 1 succ
*/
int hexstr2hex(char *hexstrp, char **ret_hex, int *ret_len){
int len;
int hex_low;
int i;

if(hexstrp == NULL || hexstrp[0] == '\0' || *ret_hex != NULL || ret_len == NULL){
    return -1;
}

len = strlen(hexstrp);
*ret_len = (len-1)/2 + 1;
*ret_hex = (char *)malloc(*ret_len);
if(*ret_hex == NULL){
    return -1;
}
memset(*ret_hex, 0, *ret_len);
for(i = 0; i < len; i++){
    if((hex_low = hexchar2hex(hexstrp[len - 1 - i])) == 16){
        free(*ret_hex);
        *ret_hex = NULL;
        return -1;
    }
    (*ret_hex)[*ret_len - 1 - i/2] = hex_low;
    i++;
    if(i < len){
        if((hex_low = hexchar2hex(hexstrp[len - 1 - i])) == 16){
            free(*ret_hex);
            *ret_hex = NULL;
            return -1;
        }
        (*ret_hex)[*ret_len - 1 - i/2] = (*ret_hex)[*ret_len - 1 - i/2] + (hex_low * 16);
    }
}
return 1;

}

int main(int argc, char **argv){
char *a = "b32ac";
char *b = NULL;
int len = NULL;
int ret;
int i;

printf("hexstr2hex return value is: %d\r\n", a, ret = hexstr2hex(a, &b, &len));
if(ret == 1){
    printf("%s = ", a);
    for(i = 0; i < len; i++){
        printf("%02x", (unsigned char)(b[i]));
    }
}
free(b);
b = NULL;
return 0;

}

BTNZF
BTNZF https://code.csdn.net/snippets/525598/master/hexstr2hex.txt/raw
接近 3 年之前 回复
BTNZF
BTNZF 这个代码,经过测试。工作的很好。
接近 3 年之前 回复
BTNZF
BTNZF 这个代码,经过测试。工作的很好。
接近 3 年之前 回复
BTNZF
BTNZF hexstr2hex return value is: 4214884 b32ac = 0b32ac Process returned 0 (0x0) execution time : 1.080 s Press any key to continue.
接近 3 年之前 回复
eagleyan
eagleyan   Rxr 2014.12.01 07:01

man page里面来的,应该是最容易的方法
const char str = "2A";
int i = (int)strtol(str, (char *
)NULL, 16);

Csdn user default icon
上传中...
上传图片
插入图片