处理IP的工具--处理UID的工具原地出战

#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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值