最近在做QT开发,需要将QlineEdit中的数字字符串转换成十六进制命令发送到下位机,
比如 “32” 转换成 unsinged short (2字节)的十六进制形式 为 :00 20
又如 “1232” 转换成 int (4字节)的十六进制形式 为:00 00 04 D0
/*将字符串转换成 short 十六进制字符串命令*/
int atoi(char *s);
string strshort_dec2hex(string str)
{
int a=atoi(str.c_str());
int s[4]={0,0,0,0},i;
string hex_str="";
char c[1];
for(i=3;i>=0;i--)
{
s[i]=(int)(a/(int)pow((double)16,(double)i));
a-=s[i]*(int)pow((double)16,(double)i);
}
for(i=3;i>=0;i--)
{
itoa(s[i],c,16);
if(c[0]>='a')
c[0]='A'+(c[0]-'a');
hex_str=hex_str+c;
if(i==2)
hex_str+=" ";
}
return hex_str;
}
/*数字字符串转换成int十六进制形式的命令*/
char *itoa(int num, char *str, int radix);
string strint_dec2hex(string str)
{
int a=atoi(str.c_str());
int s[8]={0,0,0,0,0,0,0,0},i;
string hex_str="";
char c[1];
for(i=8;i>0;i--)
{
s[i-1]=(int)(a/(int)pow((double)16,(double)(i-1)));
a-=s[i-1]*(int)pow((double)16,(double)(i-1));
}
for(i=8;i>0;)
{
itoa(s[i-1],c,16);
if(c[0]>='a')
c[0]='A'+(c[0]-'a');
i--;
hex_str=hex_str+c;
if(i%2==0&&i!=0)
hex_str+=" ";
}
return hex_str;
}
其中,在windows下itoa 和atoi函数都在C标准库中,但是在linux下我发现标准库中没有上述两个函数,所以 我自己附上了两个函数的代码:
int atoi(char s[])
{
int i = 0,sum = 0,sign; //输入的数前面可能还有空格或制表符应加判断
while(' '==s[i]||'\t'==s[i])
{
i++;
}
sign = ('-'==s[i])?-1:1;
if('-'==s[i]||'+'==s[i])
{
i++;
}
while(s[i]!='\0')
{
sum = s[i]-'0'+sum*10;
i++;
}
return sign*sum;
}
char *itoa(int value, char *string, int radix)
{
char tmp[33];
char *tp = tmp;
int i;
unsigned v;
int sign;
char *sp;
if (radix > 36 || radix <= 1)
{
//__set_errno(EDOM);
return 0;
}
sign = (radix == 10 && value < 0);
if (sign)
v = -value;
else
v = (unsigned)value;
while (v || tp == tmp)
{
i = v % radix;
v = v / radix;
if (i < 10)
*tp++ = i+'0';
else
*tp++ = i + 'a' - 10;
}
if (string == 0)
string = (char *)malloc((tp-tmp)+sign+1);
sp = string;
if (sign)
*sp++ = '-';
while (tp > tmp)
*sp++ = *--tp;
*sp = 0;
return string;
}