将字符串转化为16进制数

在有些情况下,想得到n个16进制数。然而你只能得到一个字符串数组,数组中的数据都是文本形式。
例如char *s = “1b5050508af890ef50”; 我想得到的是16进制数1b 50…,而数组中的字符,每一位都可以转化为一个16进制数,(1b转为为ASCII是 0x31 和0x61)。写代码让字符串中1b变成16进制的 0x1b

#include<stdio.h>
#include<string.h>
//这个函数会把字符转成,16进制的本身的值,例如 '1'->0x1 'b'-> 0xb
int sthvalue(char c)
{
        int value;
        if((c >= '0') && (c <= '9'))
                value = 48;
        else if ((c >= 'a') && (c <='f'))
                value = 87;
        else if ((c >= 'A') && (c <='F'))
                value = 55;
        else {
                printf("invalid data %c",c);
                return -1;
        }
        return value;
}
/*转化函数,把字符串和一个数组当做参数,这个函数会把str的值,每两个组合成一个16进制的数*/
int strtohex(char *str, char *data)
{
        int len =0;
        int sum =0;
        int high=0;
        int low=0;
        int value=0;
        int j=0;
        len = strlen(str);//获取字符串的字符个数
        //char data[256] = {0};
        printf("%d\n", len);
        //在for循环中,从0开始,每两个数组成一个16进制,高4位和低4位,然后放技能数组中去
        for(int i=0; i<len; i++)
        {

//              printf("high-n:0x%02x\n", str[i]);
                value = sthvalue(str[i]);
                high = (((str[i]-value)&0xF)<<4);//获取数据,成为高4位
//              printf("high:0x%02x\n", high);
//              printf("low-n:0x%02x\n", str[i+1]);
                value = sthvalue(str[i+1]);
                low = ((str[i+1]-value)&0xF);//获取数据,成为低4位
//              printf("low:0x%02x\n", low);
                sum = high | low; //组合高低四位数,成为一byte数据
//              printf("sum:0x%02x\n", sum);
                j = i / 2; //由于两个字符组成一byte数,这里的j值要注意
                data[j] = sum;//把这byte数据放到数组中
                i=i+1; //每次循环两个数据,i的值要再+1
        }
        return len;
}

int main()
{
        char *s = "1b5050508af890ef50";
        unsigned char buf1[256] = {0};
        int len = 0;
        printf("%s\n", s);
        len = strtohex(s, buf1);
        for (int n=0; n < (len/2); n++)
        {
                printf("0x%2X ", buf1[n]);
        }
}

结果

kayshi@ubuntu#:~/code$ gcc str_to_hex.c 
kayshi@ubuntu#:~/code$ ./a.out 
1b5050508af890ef50
18
0x1B 0x50 0x50 0x50 0x8A 0xF8 0x90 0xEF 0x50 kayshi@ubuntu#:~/code$ 

  • 4
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值