Linux应用程序开(day18) ── 字节序

内容

大端小端

大端:高位字节放在低位地址,低位字节放在高位地址
小端:高位字节放在高位地址,低位字节放在低位地址
网络协议指定了通讯字节序–大端
传输多字节顺序的时候才需要考虑大小端,单字节不需要考虑,因为怎么读都不会错误
同一计算机上的不同进程通信时不需要考虑大端还是小端

使用联合体来判断本机是大端还是小端:

union{
	short i;
	char c[sizeof(short)];
}un;

void main(){
	un.i=0x1122;

	printf("i:%d \n",un.i);
	
	printf("c1:%x \n",un.c[0]);
	printf("c1:%x \n",un.c[0]);
	printf("&c1:%p \n",&un.c[0]);
	printf("&c2:%p \n",&un.c[1]);

	
	if((un.c[0]==0x11)&&un.c[1]==0x22)
	{
		printf("大端\n");
	}else if((un.c[0]==0x22)&&(un.c[1]==0x11))
	{
		printf("小端\n");
	}
	
}

字节序反转

下面几个函数就是简单的进行反转,不关心是主机的顺序还是网络的顺序。其中,末尾为l的是转换32位的,末尾为s的是转换16位的。

uint32_t htonl(uint32_t hostint32);
uint16_t htons(uint16_t hostint16);
uint32_t ntohl(uint32_t netint32);
uint16_t ntohs(uint16_t netint16);

例程:

void main(){

        int a = 0x1122;
        printf("htonl转换前的数据:%08x 转换后的数据:%08x \n",a,htonl(a));
        printf("htons转换前的数据:%08x 转换后的数据:%08x \n",a,htons(a));
        printf("ntohl转换前的数据:%08x 转换后的数据:%08x \n",a,ntohl(a));
        printf("ntohl转换前的数据:%08x 转换后的数据:%08x \n",a,ntohs(a));
}

执行结果:
在这里插入图片描述

谢谢大家的观看,如有错误请指正,谢谢!CSDN记录成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值