#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <stdarg.h>
void showarr(unsigned char *arr ,unsigned char len){for(char i=0;i<len;i++)printf("%d ",arr[i]);printf("\r\n");}
void showstr(unsigned char *str ){printf("%s\r\n ",str);}
//"192.168.2.10"--->192 168 2 10
//思路每个.变成结束符/0再atoi即可 最后再还原即可
uint8_t IPstr2Arr1(unsigned char *sor,unsigned char *msg)
{
char *p=NULL;
char lenidex[3] ={0};
uint8_t i=0,j=0;
for(i=0;i<strlen((const char*)sor);i++)
if(sor[i]=='.')
lenidex[j++]=i;
if(j!=3)return 0;
p=(char *) sor;
sor[lenidex[0]]=0;
msg[0]=atoi(p);
p=(char *)sor+lenidex[0]+1;
sor[lenidex[1]]=0;
msg[1]=atoi(p);
p=(char *)sor+lenidex[1]+1;
sor[lenidex[2]]=0;
msg[2]=atoi(p);
p=(char *)sor+lenidex[2]+1;
msg[3]=atoi(p);
//bug
for(i=0;i<3;i++)
sor[lenidex[i]]='.';
showarr(msg,4);
showstr(sor);
return 1;
}
//"192.168.2.10"--->192 168 2 10
//思路用strtok截取子串
uint8_t IPstr2Arr2(unsigned char *Sor,unsigned char *msg)
{
unsigned char sor[50]={0};//它会修改Sor!!
char *p=NULL;
uint8_t i=0,j=0;
memcpy(sor,Sor,strlen((const char*)Sor));
for(i=0;i<strlen((const char*)sor);i++)
if(sor[i]=='.')
j++;
if(j!=3)return 0;
//新技能字符串分割strtok
i=0;
p=strtok((char *)sor,".");//第一次拿到192.
while( p )
{
printf("%s\r\n",p);
msg[i++]=atoi(p);
p=strtok(NULL,".");//第二次拿到168.
}
showarr(msg,4);
showstr(sor);
//bug 以后Sor修改了!!!只有198了
return 1;
}
//"192.168.2.34"--->192 168 2 34
//思路用sscanf来一个一个输入
void IPstr2Arr3(unsigned char *sor,unsigned char *arr)
{
char *p=(char *)sor;
char temstr[4] ={0};
int temnum=0;
for(char i=0;i<4;i++)
{
memset(temstr,0,4);
sscanf(p,"%[^.]",temstr); printf("%s\n",temstr);//每次从p拿到一个 只要不是.就放入temstr
p=strstr(p,".");//每次后移 类似方法1
p++;
#if 0
sscanf(temstr,"%d",&temnum);//每次从temstr拿到%d 类似atoi
arr[i]=(unsigned char )temnum;printf("%d\n",arr[i]);
#else
arr[i]=atoi(temstr);
#endif
}
showarr(arr,4);
showstr(sor);
}
//"192.168.2.34"--->192 168 2 34
//思路用sscanf正则
void IPstr2Arr4(unsigned char *sor,unsigned char *arr)
{
int Arr[4];
sscanf((const char*)sor,"%d.%d.%d.%d",&Arr[0],&Arr[1],&Arr[2],&Arr[3]);
for(char i=0;i<4;i++)
arr[i]=Arr[i];
showarr(arr,4);
showstr(sor);
}
void IPArr2Str(unsigned char *arr,unsigned char *str)
{
sprintf((char*)str,"%d.%d.%d.%d",arr[0],arr[1],arr[2],arr[3]);
showarr(arr,4);
showstr(str);
}
int main(void)
{
unsigned char msg[] ={"192.168.2.34"};
unsigned char arr[4] ={0};
//IPstr2Arr1(msg,arr);
//IPstr2Arr2(msg,arr);
//IPstr2Arr3(msg,arr);
IPstr2Arr4(msg,arr);//["192-168-2-34" %d-%d-%d-%d]
IPArr2Str(arr,msg);
return 1;
}
++++++++++++++++++++20190805增加一个案例 自己编自己+++++++++++
#include <stdio.h>
#include <string.h>
void showarr(unsigned char *arr ,unsigned char len){for(char i=0;i<len;i++)printf("0X%02X ",arr[i]);printf("\r\n");}
void showstr(unsigned char *str ){printf("%s\r\n ",str);}
void IPArr2Str(unsigned char *arr,unsigned char *str)
{
sprintf((char*)str,"%02X%02X%02X%02X%02X%02X%02X%02X",arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7]);
showarr(arr,8);//异常!!!0X34 0X30 0X44 0X31 0X42 0X42 0X30 0X31 哈哈原地转圈以后 它已经自己变化了 现在是‘4’‘0’这样
showstr(str);//40D1BB0133CE6498 正常
}
int main(void)
{
unsigned char arr[8]={0X40, 0XD1 ,0XBB ,0X01 ,0X33 ,0XCE ,0X64 ,0X98};
showarr(arr,8);//0X40 0XD1 0XBB 0X01 0X33 0XCE 0X64 0X98 正常!!!!!
IPArr2Str(arr,arr);
}
0X40 0XD1 0XBB 0X01 0X33 0XCE 0X64 0X98 -----》40D1BB0133CE6498
在自己玩 就搞砸了 自己想想 错在哪里?
逻辑混乱!!前面sprintf后面已经自己把自己串改了 所以不可以!!不能原地处理了
ERR CODE
void HANDEL(unsigned char *arr,char len)
{
for(char l=0;l<len;l++)
sprintf((char*)&arr[2*l],"%02X",arr[l]);
}
int main(void)
{
unsigned char arr[8]={0X40, 0XD1 ,0XBB ,0X01 ,0X33 ,0XCE ,0X64 ,0X98};
showarr(arr,8);//0X40 0XD1 0XBB 0X01 0X33 0XCE 0X64 0X98 正常!!!!!
HANDEL(arr,8);
showstr(arr);
}