首先明确如下事实:
1.网络字节序采用Big-Endian排序方式,即从低位地址开始运输
2.程序执行从高位地址到低位地址
3.逐字节从变量的低位地址空间开始逐字节遍历
4.每八位一存储
待解决的问题:
1.完成点分十进制去点的转换
使用in_addr_t inet_addr(const char *cp);
头文件为#include<arpa/inet.h>
另:将二进制转换成点分十进制:char *inet_ntoa(struct in_addr in);
2.将命令行参数由字符串类型转换为整型
使用int atoi(const char *nptr);
头文件为#include <stdlib.h>
3.完成字节序的转换
/*以下函数定义在<arpa/inet.h>*/
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
4.完成逐位输出
强制转换字符指针
先来看这段代码
#include <stdio.h>
int main()
{
int a = 0x11223344; //十六进制数
char *pc = (char*)&a;
*pc = 0;
printf("%x\n", a);
return 0;
}
这里定义的a是一个整形的变量,而指针pc定义的是字符型指针,char*类型的指针变量pc指向只能指向字符类型的空间,如果是指向非char类型的空间,如这里的指向int类型空间,就必须要将该空间的地址强转为char*类型,因此在&a前要加上(char*)来进行强制类型转换。
又因char型的指针访问的是一个字节的地址,int类型的单位数据为四个字节,所以*pc只能访问并修改a地址中的第一个字节中的数据
5.完成规范输出
设置输出的位数,以及高位补0
代码如下:
#include<stdio.h>
#include<arpa/inet.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
const char *ipv4_n_dot = argv[1];//点分十进制网络字节序ip
u_int16_t port_decimal = atoi(argv[2]);//string to integer
u_int32_t ipv4_h, ipv4_n;
u_int16_t port_h, port_n;
port_n = htons(port_decimal); //网络字节序port
ipv4_n = inet_addr(ipv4_n_dot);//去点ip
unsigned char *ipv4_n_cbc = (char*)&ipv4_n;//强转字符指针
unsigned char *port_n_cbc = (char*)&port_n;
printf("[ipv4_n_cbc_d]%d.%d.%d.%d\n",ipv4_n_cbc[0],ipv4_n_cbc[1],ipv4_n_cbc[2],ipv4_n_cbc[3]);
printf("[ipv4_n_cbc_x]%02x%02x%02x%02x\n", ipv4_n_cbc[0],ipv4_n_cbc[1],ipv4_n_cbc[2],ipv4_n_cbc[3]);
printf("[ipv4_n_asw_x]%08x\n",ipv4_n);
printf("[port_n_cbc_x]%02x%02x\n",port_n_cbc[0],port_n_cbc[1]);
printf("[port_n_cbc_x]%04x\n", port_n);
printf("[port_n_asw_d]%d\n",port_n);
ipv4_h = ntohl(ipv4_n);
port_h = ntohs(port_n);
unsigned char *ipv4_h_cbc = (char*)&ipv4_h;//强转字符指针
unsigned char *port_h_cbc = (char*)&port_h;
printf("[ipv4_h_cbc_d]%d.%d.%d.%d\n",ipv4_h_cbc[0],ipv4_h_cbc[1],ipv4_h_cbc[2],ipv4_h_cbc[3]);
printf("[ipv4_h_cbc_x]%02x%02x%02x%02x\n", ipv4_h_cbc[0],ipv4_h_cbc[1],ipv4_h_cbc[2],ipv4_h_cbc[3]);
printf("[ipv4_h_asw_x]%08x\n", ipv4_h);
printf("[port_h_cbc_x]%02x%02x\n",port_h_cbc[0],port_h_cbc[1]);
printf("[port_h_asw_x]%04x\n",port_h);
printf("[port_h_asw_d]%d\n",port_h);
}