大端:指的是一个整数的高位字节存放在内存的低地址处
小端:指的是一个整数的低位字节存放在内存的低地址处
现代PC大多采用的是小端字节序,又称为主机字节序,而网络中传输数据时使用的是大端字节序,又称为网络字节序
如何判断大小端呢?代码如下:
//判断大端或者小端
void IsPort()
{
union
{
short int a;//短整型两个字节
char b[sizeof(short int)];
}values;
values.a = 0x0102;
if(values.b[0] == 0x1 && values.b[1] ==0x2)
{
printf("this is big\n");
}
else if(values.b[0] == 0x2 && values.b[1] == 0x1)
{
printf("this is little\n");
}
else
{
printf("unknown........\n");
}
}
bool IsBig()
{
union
{
short int a;//短整型两个字节
char b;
}values;
values.a = 0x1234;
if(values.b == 0x12)
{
return true;
}
return false;
}
bool IsBig1()
{
int a = 0x1234;
char b = *(char*)&a;
if(b == 0x12)
{
return true;
}
return false;
}
int main()
{
/*IsPort();
if(IsBig1())
{
printf("this is big\n");
}
else
{
printf("this is little\n");
}*/
}
模拟hton函数将小端转为大端,代码如下:
/*
先判断a是否是本机字节序 如果是本机字节序才需要转 逆序即可 处理单位为字节
0x12345678---->0x78563412
*/
long htons(long a)
{
long b = 0;
if(IsBig())
return a;
for(int i = 0 ; i < sizeof(a);++i)
{
b = (b<<8) | (a & 0xff);
a >>= 8;
}
return b;
}
判断一个合法的ip地址,代码如下:
bool IsIpv4( char *str)
{
char *ptr;
int count = 0;
char *p = str;
while(*p != '\0')
{
if(*p == '.')
count++;
if(count > 3)//一旦'.'点数大于3就为非法
return false;
p++;
}
count = 0;
ptr = strtok(str,".");
while(ptr != NULL)
{
count++;//控制切割次数
//出现负号 坐着开始以01开头 非法
if((ptr[0] == '-') || (ptr[0] == '0' && ptr[1] == '1') )
return false;
//将切割的每个部分转换成整数
int a = atoi(ptr);
//如果第一次切割后第一部分为0 不能以0开头 非法
if(count == 1 && a == 0) return false;//第一次分割出来的不能为0 以0开头不是合法的地址
//数字不再0-255之间也为非法
if(a < 0 || a > 255)
return false;
//下一次切割
ptr = strtok(NULL,".");
}
//切割四次才正确
if(count == 4)
return true;
else
return false;
}
int main()
{
char buf[100];
while(cin>>buf,buf[0] != '#')
{
if(IsIpv4(buf))
{
cout<<"合法"<<endl;
}
else
{
cout<<"非法"<<endl;
}
}
}