1. 程式人生 > 其它 >AIApe問答機器人Beta階段總結

AIApe問答機器人Beta階段總結

1、字串轉十六進位制

程式碼實現:

voidStrToHex(char*pbDest,char*pbSrc,intnLen)
{
charh1,h2;
chars1,s2;
inti;

for(i=0;i<nLen/2;i++)
{
h1=pbSrc[2*i];
h2=pbSrc[2*i+1];

s1=toupper(h1)-0x30;//toupper轉換為大寫字母
if(s1>9)
s1-=7;
s2=toupper(h2)-0x30;
if(s2>9)
s2-=7;

pbDest[i]=s1*16+s2;
}
}

2、十六進位制轉字串

程式碼實現:

voidHexToStr(char*pszDest,char*pbSrc,intnLen)
{
charddl,ddh;
for(inti=0;i<nLen;i++)
{
ddh=48+pbSrc[i]/16;
ddl=48+pbSrc[i]%16;
if(ddh>57)ddh=ddh+7;
if(ddl>57)ddl=ddl+7;
pszDest[i*2]=ddh;
pszDest[i*2+1]=ddl;
}
pszDest[nLen*2]='\0';
}

或者

u16Hex2StringArray(u8*pSrc,u16SrcLen,u8*pObj)
{
u16i=0;

for(i=0;i<SrcLen;i++)
{
sprintf((char*)(pObj+i*2),"%02X",*(pSrc+i));
}
*(pObj+i*2)='\0';
return(i*2);
}



效果:十六進位制:0x13 0xAA 0x02轉為字串:”13AAA2

3、字串轉十進位制

程式碼實現:

第一種,如果帶負號 這個就是atoi函式的實現:

intmy_atoi(constchar*str)
{
intvalue=0;
intflag=1;//判斷符號
while(*str=='')//跳過字串前面的空格
{
str++;
}
if(*str=='-')//第一個字元若是‘-’,說明可能是負數
{
flag=0;
str++;
}
elseif(*str=='+')//第一個字元若是‘+’,說明可能是正數
{
flag=1;
str++;
}//第一個字元若不是‘+’‘-’也不是數字字元,直接返回0
elseif(*str>='9'||*str<='0')
{
return0;
}
//當遇到非數字字元或遇到‘\0’時,結束轉化
while(*str!='\0'&&*str<='9'&&*str>='0')
{
value=value*10+*str-'0';//將數字字元轉為對應的整形數
str++;
}
if(flag==0)//負數的情況
{
value=-value;
}
returnvalue;
}

效果:字串:”-123” 轉為 -123

第二種,如果不帶負號:

voidStrtoDec(uint32_t*pbDest,char*pbSrc,intnLen)
{
inti;
inttmp=0;
if(nLen>10)
*pbDest=0;
tmp=1;
*pbDest=0;
for(i=nLen-1;i>=0;i--)
{
*pbDest+=tmp*(*(pbSrc+i)-'0');
tmp=tmp*10;
}
}

效果:字串:”123” 轉為 123

第三種:包含轉為浮點數:

//m^n函式
//返回值:m^n次方.
u32NMEA_Pow(u8m,u8n)
{
u32result=1;
while(n--)result*=m;
returnresult;
}
//str轉換為數字,以','或者'*'結束
//buf:數字儲存區
//dx:小數點位數,返回給呼叫函式
//返回值:轉換後的數值
intNMEA_Str2num(u8*buf,u8*dx)
{
u8*p=buf;
u32ires=0,fres=0;
u8ilen=0,flen=0,i;
u8mask=0;
intres;
while(1)//得到整數和小數的長度
{
if(*p=='-'){mask|=0X02;p++;}//是負數
if(*p==','||(*p=='*'))break;//遇到結束了
if(*p=='.'){mask|=0X01;p++;}//遇到小數點了
elseif(*p>'9'||(*p<'0'))//有非法字元
{
ilen=0;
flen=0;
break;
}
if(mask&0X01)flen++;
elseilen++;
p++;
}
if(mask&0X02)buf++;//去掉負號
for(i=0;i<ilen;i++)//得到整數部分資料
{
ires+=NMEA_Pow(10,ilen-1-i)*(buf[i]-'0');
}
if(flen>5)flen=5;//最多取5位小數
*dx=flen;//小數點位數
for(i=0;i<flen;i++)//得到小數部分資料
{
fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');
}
res=ires*NMEA_Pow(10,flen)+fres;
if(mask&0X02)res=-res;
returnres;
}

效果:字串:”123.456” 先轉為 123456,然後除以1000得到123.456

4、十進位制轉字串

程式碼實現:

如果只是單個十進位制轉字串,使用sprintf函式就可以了。

如果是十進位制陣列:

u16DectoStr(u8*pSrc,u16SrcLen,u8*pObj)
{
u16i=0;

for(i=0;i<SrcLen;i++)
{
sprintf((char*)(pObj+i*2),"%02d",*(pSrc+i));
}
*(pObj+i*2)='\0';
return(i*2);
}

效果:十進位制陣列13 14轉為字串“1314”

5、u8、u32轉換

舉個栗子:ASCII碼裡

這裡寫圖片描述 字元‘A’ , 一個位元組8bit ,即u8 十六進位制為 0x41 二進位制為 0100 0001

而對應的十進位制為 65 整型65,4個位元組32bit,即u32 十六進位制為 0x41 二進位制為 0000 0000 0000 0000 0000 0000 0100 0001

將u32數轉換成u8陣列

注意:這裡是字元陣列,不是字串

字串是以空字元(\0)結尾的char陣列

voidU32ToU8Array(uint8_t*buf,uint32_tu32Value){
buf[0]=((u32Value>>24)&0xFF);
buf[1]=((u32Value>>16)&0xFF);
buf[2]=((u32Value>>8)&0xFF);
buf[3]=(u32Value&0xFF);
}

效果:整型 50 轉字元陣列 {‘\0’,’\0’,’\0’,’2’}

u8陣列轉u32

voidU8ArrayToU32(uint8_t*buf,uint32_t*u32Value)
{
*u32Value=(buf[0]<<24)+(buf[1]<<16)+(buf[2]<<8)+(buf[3]<<0);
}

效果:字元陣列 {‘\0’,’\0’,’\0’,’2’}轉為整型 50

6、大端小端

最後就是大小端問題了。STM32 預設是小端模式的,那麼該如何轉為大端?

1、轉為大端

為大端:
pPack[0]=(u8)((len>>8)&0xFF);
pPack[1]=(u8)(len&0xFF);

為小端:
pPack[0]=(u8)(len&0xFF);
pPack[1]=(u8)((len>>8)&0xFF);

效果:len為資料型別為 u16(short),比如 0x11 0x22,轉為u8(usigned char)陣列。

大端為:

pPack[0](0x11)
pPack[1](0x22)

小端為:

pPack[0](0x22)
pPack[1](0x11)