字节序转换

首先明确如下事实:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理工男头发不值钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值