字节序(学习笔记)

1、字节序概念

       是指多字节数据的存储顺序

2、分类

        (1)大端格式:将低位字节数据存储在低地址(首地址)

        (2)小端格式:将高位字节数据存储在低地址(首地址)

 

问题1:如何确定我们主机的字节序格式?

3、使用union函数确定主机的字节序格式

#include<stdio.h>

union  A
{
	int a;
    char b; 
		
};
int main()
{
   union A myunion;

   myunion.a= 0x12345678;

   if(myunion.b==0x12)
{
	printf("大端格式 \n");
}
	else 
{
    printf("小端格式\n");
	}
		
	
     return 0;
	}

运行结果

小端格式 

问题2:我们为什么要学习字节序,有什么用处?

        我们学习了linux网络编程,我要与你通信,是不是需要把语言规定好。上面提到的字节序有两种格式。

         假设小端格式是说汉语,大端格式是说英语。我的电脑是小端格式(说听都是用汉语),你的电脑是大端格式(说听都是用英语)。我发中文给你,你能听的懂??听不懂。你发英语给我,我也听不懂。

           那么,我们这算是交流??肯定不是,这是  对牛弹琴

因此,我们需要统一使用同一种格式(让我们在同一个频道上)

网络协议:指定了通讯字节序---------------大端格式

4、字节序转化函数

4.1特点:

1、网络协议指定了通讯字节序—大端
2、只有在多字节数据处理时才需要考虑字节序
3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序
4、异构计算机之间通讯,需要转换自己的字节序为网络字节序
在需要字节序转换的时候一般调用特定字节序转换函数

          host ‐‐> network(主机字节序转化网络字节序(大端))

4.2、函数定义1(htonl)

                          host ‐‐> network(主机字节序转化网络字节序(大端格式))

头文件

             #include <arpa/inet.h>

函数:
              uint32_t htonl(uint32_t hostint32);
 功能:
              将32位主机字节序数据转换成网络字节序数据
参数:
               hostint32:待转换的32位主机字节序数据
 返回值:
               成功:返回网络字节序的值

4.3、函数定义2(htons) 

                         host ‐‐> network(主机字节序转化网络字节序(大端格式))

头文件              

              #include <arpa/inet.h>

函数:
              uint16_t htons(uint16_t hostint16);
功能:
              将16位主机字节序数据转换成网络字节序数据
参数:
               uint16_t:unsigned short int
               hostint16:待转换的16位主机字节序数据
 返回值:
              成功:返回网络字节序的值

          network ‐‐> host(网络字节序(大端)转化主机字节序)

4.4、函数定义3(ntohl)

                  network ‐‐> host(网络字节序(大端格式)转化主机字节序)

头文件

               #include <arpa/inet.h>

  函数:
               uint32_t ntohl(uint32_t netint32);
 功能:
              将32位网络字节序数据转换成主机字节序数据
 参数:
              uint32_t: unsigned int
              netint32:待转换的32位网络字节序数据
 返回值:
             成功:返回主机字节序的值 

4.5、函数定义4(ntohs) 

              network ‐‐> host(网络字节序(大端格式)转化主机字节序)

头文件

               #include <arpa/inet.h>

  函数:
               uint16_t ntohs(uint16_t netint16);
 功能:
              将16位网络字节序数据转换成主机字节序数据
 参数:
             uint16_t: unsigned short int
             netint16:待转换的16位网络字节序数据
 返回值:
             成功:返回主机字节序的值 

45、简单的使用 

#include<stdio.h>
#include <arpa/inet.h>

  int main()
  {
	  
	int a = 0x12345678;

	short b=0x1234;
   printf("a = 0x12345678\n");
   printf("b = 0x1234\n");
  
   printf("host---------network\n");

	printf("%#x\n",htonl(a));

	printf("%#x\n",htons(b));
   printf("network---------host\n");
  
	printf("%#x\n",ntohl(a));

	printf("%#x\n",ntohs(b));
   	  
	  
	  
	  
	  
	  
	  return 0;
	  }

运行结果

 a = 0x12345678
 b = 0x1234
  host---------network
0x78563412
0x3412
  network---------host
0x78563412
0x3412

本机(host)是小端模式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值