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
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中如何将数转化为字符串
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。以下是用itoa()函数将整数转换为字符串的一个例子:# include <stdio. h> # include <stdlib. h> void main (void); void main (void) { int num = 100; char str[25]; itoa(num,
C语言中如何将数字转换成字符串
发现了一个很好的转换函数吧   char * int_to_char(int a)   {   char *b;   sprintf(b,"%d",a);   return b;   }   更多,参考:atof(将字符串转换成浮点型数)   atoi(将字符串转换成整型数)   atol(将字符串转换成长整
C语言中怎么把Int型转成字符型
C语言中怎么把Int型转成字符型,?C语言,标准库函数中有itoa(int,char*s,radix) 和 ltoa(long,char*s,radix) 下面是一个Sourceforge.org上的例子:void reverse(char *s) {  char *c;  int i;  c = s + strlen(s) - 1;  while(s     i = *s;    *
C语言把字符数字转变成数值数字
要求: 通过输入数字字符,实现输出数值字符的功能;         与例子3 + 33 + 333 + ……输入变化的个数,得出结算结果,很像的 思想: 1.转变成数值的思想是: 1 = ‘1’- ‘0’; 即:通过和0的字符ascii码相减而得到数值; 2.如果位数比较多,那么还要乘100 乘10 乘1000 甚至更多 &=、、那么: 给出一个循环从高位乘10开始:累计data加各位,乘
C语言中把数字转换为字符串
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。 sprintf 是个变参函数,定义如下: int sprintf( char *buffer, const char *format [,
用C语言写的一个简单的将数字金钱转换为文字
用C语言写的一个简单的将数字金钱转换为文字                                                                                                                                                 作者:TheKingOfNight ----------
C语言中如何将数字转换成字符串?
文章转自:http://blog.163.com/xiaowh001@126/blog/static/1658403732011111673022648/   偶然遇到这个问题,想了半天竟然没有思路。 感觉用" "+25应该是可以的,结果发现竟然不能了,难道是编译器不对。 发现了一个很好的转换函数吧 char * int_to_char(int a){ char *b; sprint
C语言将整形转化为对应的字符型
输入一个整形数,返回对应的字符串数组
C语言中将字符串转化为数字的函数总结
atoX系列函数 1、atoi函数 所在库 原型:int atoi(const char *str); 形参:一个指向字符串的指针 返回值:这个字符串中的数字对应的 int 型数 功能:将从字符串的第一个位置开始,略去空白,将字符型数字转化为数值型数字,直到遇到第一个非数字型字符时停止。如果字符串中第一个元素不是数字,那么返回0。可以识别正负号。 例子: #include #in
C语言中将数字转换为字符串的方法
C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。以下是用itoa()函数将整数转换为字符串的一个例子: # include # include void main (void); void main (void) {     int num = 100;     char str[25];     itoa(num, str, 1