在有些情况下,想得到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$