重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#include stdio.h
创新互联是一家专业的成都网站建设公司,我们专注成都网站建设、成都网站设计、网络营销、企业网站建设,外链,1元广告为企业客户提供一站式建站解决方案,能带给客户新的互联网理念。从网站结构的规划UI设计到用户体验提高,创新互联力求做到尽善尽美。
int IsHexChar(char ch)
{
if((ch='0' ch='9') || (ch='a' ch='f') ||(ch='A' ch='F'))
return 1;
else
return 0;
}
int main()
{
char str[1000] = "123342abcdAFB1H";
int cnt = 0;
int i;
printf("input str:\n");
//gets(str);
i = 0;
while(str[i]str[i+1])
{
if(IsHexChar(str[i]) IsHexChar(str[i+1]))
{
cnt++;
printf(cnt==1?"0x%c%c":", 0x%c%c", str[i], str[i+1]);
i++;
i++;
}
else
break;
}
printf("\ncnt = %d\n", cnt);
return 0;
}
c语言有int转hex的库函数,数据类型转换与进制转换(hex转str,str转hex/ASCII,str转float/int,float/int转str,进制转换等)——C语言篇... 转载
2021-05-19 01:37:09
weixin_39878989
码龄5年
关注
理清楚数据类型转换,还是要回归ASCII码、
引用一下的ASCII表方便对比学习。在单片机中其实是自动识别十进制与十六进制的,但是有时候需要对数据转换获取想要的进制数。下面介绍几种数据类型的转换,此外方法很多,只简单介绍本人愚见。
97076b76df964194b190af80b79937b9.jpg
一、字符串转ASCII
字符串其实就是上述ASCII表中的图形栏内容,转换成hex,即变成对应的十六进制数。通常以0123456789ABCDEF,进行转换。找规律:字符 '0' 对应0x30 字符 '1' 对应0x31 字符‘A’ 对应0x41 字符 ‘a’对应 0x61 等这些都是简单,早就知道的。换成C语言则可以这样写:
‘0~9‘ + 0x30
‘A~F’ - 'A'+10
'a~f' - 'a'+10
void str_to_acsll(uint8_t *s_inchar, uint8_t s_len, uint8_t *a_outtxt)
{
uint8_t size1=0,i=0;
for( size1=0;size1{
if( s_inchar[size1]='0' s_inchar[size1] = '9')
{
a_outtxt[size1] = s_inchar[size1] - 0x30;
}
else if( s_inchar[size1]='A' s_inchar[size1] = 'F')
{
a_outtxt[size1] = s_inchar[size1] - 'A'+10;
}
else if( s_inchar[size1]='a' s_inchar[size1] = 'f')
{
a_outtxt[size1] = s_inchar[size1] - 'a'+10;
}
}
for( size1=0,i=0;size1=s_len; size1++,i++)
{
a_outtxt[i]=(a_outtxt[size1]4)|a_outtxt[++size1];
}
a_outtxt[i] = '\0';
}
二、字符串转hex
这个是用于把字符串占两个字节的,合成为一个hex使用。比如:“FF” - 0xff 字符串占用的是两个字节的数其实是一个hex的,那么就要位移合成。
uint16_t stringtohex(uint8_t *buf, uint8_t * format, uint16_t us_length)
{
uint8_t tempcode;
uint16_t uslength = us_length * 2,us_count = 0,us_data;
for(us_data = 0;us_count uslength; us_count += 2,us_data++)
{
tempcode = format[us_data] 4;
if(tempcode = 9)
{
buf[us_count] = tempcode + '0';
}
else
{
buf[us_count] = tempcode - 10 + 'A';
}
tempcode = format[us_data] 0X0F;
if(tempcode = 9)
{
buf[us_count+1] = tempcode + '0';
}
else
{
buf[us_count+1] = tempcode - 0X0A + 'A';
}
}
buf[uslength] = '\0';
return uslength;
}
三、float 转hex
union valReg
{
char onenet_data[4];
float onenet_float;
};
union valReg onenet_val;
///float数据大小端的问题,低字节在后,高字节在前
int test()
{
float test_f=3.14;
uint8_t test_i8[4];
onenet_val.onenet_float=test_f;
test_i8[....]=onenet_val.onenet_data[...];即转换完成
}
4. C标准库的使用
sprintf((char *)srtbuf,"%d %f %s ", i8,float,buf );
相关资源:VC进制转换:10进制整型转2、8、16进制_c++int转16进制-C++代
可以看一下C的标准库函数fprintf(char* fmt, ...),应该和你说的函数差不多。
十六进制转成十进制的函数:
//返回16进制字符串s对应的整数值,遇到任何一个非法字符都返回-1。
int HexToDec(char *s)
{
char *p = s;
//空串返回0。
if(*p == '\0')
return 0;
//忽略开头的'0'字符
while(*p == '0')
p++;
int dec = 0;
char c;
//循环直到字符串结束。
while(c = *p++)
{
//dec乘16
dec = 4;
//数字字符。
if(c = '0' c = '9')
{
dec += c - '0';
continue;
}
//小写abcdef。
if(c = 'a' c = 'f')
{
dec += c - 'a' + 10;
continue;
}
//大写ABCDEF。
if(c = 'A' c = 'F')
{
dec += c - 'A' + 10;
continue;
}
//没有从任何一个if语句中结束,说明遇到了非法字符。
return -1;
}
//正常结束循环,返回10进制整数值。
return dec;
}
十进制转成二进制的函数:
/*递归法求二进制数*/
#includestdio.h
void printb(int x,int n);
void main()
{
int x;
printf("input number:");
scanf("%d",x);
printf("number of decimal form: %d\n",x);
printb(x,sizeof(int)*8);
putchar('\n');
}
void printb(int x,int n)
{
if(n0)
{
putchar('0'+( (unsigned)(x (1(n-1) ) )(n-1)));
printb(x,n-1);
}
}
在KEIL软件上建立工程项目,编辑C语言,编译调试无错后,点击project下的options for target,在output标签下勾选输出HEX,确定后就在编译一下会自动生成HEX文件在相同目录里。