大端法、小端法、网络字节序

摘要:
字节顺序UNXI网络编程的定义是,术语“小端”和“大端”表示多字节值的哪一端存储在值的起始地址。它存储在大端法和小端法的系统中,如图1所示。网络字节顺序定义:接收到的第一个字节被视为高位,这要求发送方发送的第一字节应该是高位。Htonl将i_当num转换为网络字节顺序时,可以看出网络字节顺序是大端法。总结点:80X86使用小端方法,网络字节顺序使用大端方法。
关于字节序(大端法、小端法)的定义
《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。

 

也可以说: 
1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。 
2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。

举个简单的例子,对于整形0x12345678。它在大端法和小端法的系统内中,分别如图1所示的方式存放。

zijiexu_pic_1 

 

网络字节序

我们知道网络上的数据流是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理呢? 
网络字节序定义:收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。可见多字节数值在发送前,在内存中数值应该以大端法存放。 
网络字节序说是大端字节序。 
比如我们经过网络发送0x12345678这个整形,在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放,如图2所示。

zijiexu_pic_2

 

字节序测试程序 

不同cpu平台上字节序通常也不一样,下面写个简单的C程序,它可以测试不同平台上的字节序。

#include <stdio.h>
#include <netinet/in.h>
int main()
{
    int i_num = 0x12345678;
    printf("[0]:0x%x ", *((char *)&i_num + 0));
    printf("[1]:0x%x ", *((char *)&i_num + 1));
    printf("[2]:0x%x ", *((char *)&i_num + 2));
    printf("[3]:0x%x ", *((char *)&i_num + 3));
10   
11      i_num = htonl(i_num);
12      printf("[0]:0x%x ", *((char *)&i_num + 0));
13      printf("[1]:0x%x ", *((char *)&i_num + 1));
14      printf("[2]:0x%x ", *((char *)&i_num + 2));
15      printf("[3]:0x%x ", *((char *)&i_num + 3));
16   
17      return 0;
18 } 

在80X86CPU平台上,执行该程序得到如下结果: 
[0]:0x78 
[1]:0x56 
[2]:0x34 
[3]:0x12

[0]:0x12 
[1]:0x34 
[2]:0x56 
[3]:0x78

分析结果,在80X86平台上,系统将多字节中的低位存储在变量起始地址,使用小端法。htonl将i_num转换成网络字节序,可见网络字节序是大端法。

总结点:80X86使用小端法,网络字节序使用大端法。


免责声明:文章转载自《大端法、小端法、网络字节序》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇推荐一些常用感觉不错的jQuery插件linux桌面的安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mysql数据优化--DBA梳理珍藏篇

1. 优化SQL1)     通过show status了解各种sql的执行频率         show status like 'Com_%'        了解 Com_select,Com_insert 的执行次数 2)    通过Explain分析低效的sql语句 3)    建立合适的索引 4)    通过show status like '...

计算数组的实际长度

今天练习大数计算时出现,数组越界问题,经过调试后发现原来是数组越界问题。在这里本人就强调一下使用length算出的是数组开辟内存空间的长度,而不是数组实际使用的长度。比如说你申请了int array[] = new int[100],但是你只输入了10个整数时。如果用length求数组长度,显示的长度是100,而不是10,如果想求数组的实际长度10,那么可...

CentOS---网络配置详解

一、配置文件详解在RHEL或者CentOS等Redhat系的Linux系统里,跟网络有关的主要设置文件如下: /etc/host.conf         配置域名服务客户端的控制文件 /etc/hosts             完成主机名映射为IP地址的功能 /etc/resolv.conf       域名服务客户端的配置文件,用于指定域名服务器的位...

结对第二次作业(智能匹配)

一、GitHub传送门 二、结对成员 陈甘霖(031502604) 李家鹏(031502615) 三、问题描述 提供输入包括: 20个部门 部门编号(唯一值) 各部门需要学生数的要求的上限(单个,数值,在[0,15]内); 部门的特点标签(多个,字符); 各部门的常规活动时间段(多个,字符/日期); 300个学生 学号(唯一值);...

Bing Maps进阶系列三:使用地图图像服务(ImageryService)

  地图图像服务(ImageryService)提供了根据地理位置(经度和纬度)坐标和地图的缩放级别解析出对应于地图图片系统的完整地图数据元数据,包括图片映射地址、图片大小等一系列详细参数。通过该服务的服务接口也可以反向实现通过指定地理位置坐标、地图缩放级别和图片大小(高度和宽度)来生成不同的地图图片。   一、添加ImageryService的Web服务引...

使用memset()要注意

原型如下: ptr是要写入的内存块的指针,value是要写入的值,num是从ptr指向的首地址开始一共要写入的字节数。 要注意num传入的参数 错误示范:    实际上sizeof(InDegree)是4,等于sizeof(int)。也就是说这里的num参数只是一个指针的大小,没有完成初始化工作,除了第一个数组元素外,剩下的都是随机值。 应该改成:...