网络字节序
2013-09-26 21:32
190 查看
1、字节序:分为大端字节序和小段字节序
a、大端字节序(Big Endian)
最高有效位(MSB:Most Significant Bit)存储于最低内存地址处,最低有效位(LSB:Lowest Significant Bit)存储于最高内存地址处。
例如:数据16进制数据:0x12345678,在内存中存放形式如下: 12 34 56 78
(其中 0x12为高位数据 。。。。0x78为低位数据)
b、小端字节序(Little Endian)
最高有效位(MSB:Most Significant Bit)存储于最高内存地址处,最低有效位(LSB:Lowest Significant Bit)存储于最低内存地址处。
例如:数据16进制数据:0x12345678,在内存中存放形式如下: 78 56 34 12
(其中 0x12为高位数据 。。。。0x78为低位数据)
2、主机字节序
不同的主机有不同的字节序,如x86为小端字节序,Motorola 6800为大端字节序,ARM字节序是可配置的。
3、 网络字节序
网络字节序规定为大端字节序
如何验证x86平台下的字节序?
代码如下:
//file:01byteorder
#include<stdio.h>
#include<arpa/inet.h>
int main()
{
unsigned int x=0x12345678;
unsigned char *p=(unsigned char*)&x;
printf("x86字节序:");
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
unsigned int y=htonl(x);
printf("主机字节序->网络字节序:");
p=(unsigned char*)&y;
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
unsigned int z=ntohl(y);
printf("网络字节序->主机字节序:");
p=(unsigned char*)&z;
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
return 0;
}
则我们的预期目标是:78 56 34 12 ,那么x86为小端字节序:
![](https://img-blog.csdn.net/20130926212905250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemZzX2t1YWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
综上所属:不同的硬件平台字节序是不一样的,这就需要字节序的转化
例如:电脑A和手机B进行通信,则需要如下转化
A端:主机字节序->网络字节序(小端字节序->大端字节序)
B端:网络字节序->主机自字节序(大端字节序->大端字节序)
a、大端字节序(Big Endian)
最高有效位(MSB:Most Significant Bit)存储于最低内存地址处,最低有效位(LSB:Lowest Significant Bit)存储于最高内存地址处。
例如:数据16进制数据:0x12345678,在内存中存放形式如下: 12 34 56 78
(其中 0x12为高位数据 。。。。0x78为低位数据)
b、小端字节序(Little Endian)
最高有效位(MSB:Most Significant Bit)存储于最高内存地址处,最低有效位(LSB:Lowest Significant Bit)存储于最低内存地址处。
例如:数据16进制数据:0x12345678,在内存中存放形式如下: 78 56 34 12
(其中 0x12为高位数据 。。。。0x78为低位数据)
2、主机字节序
不同的主机有不同的字节序,如x86为小端字节序,Motorola 6800为大端字节序,ARM字节序是可配置的。
3、 网络字节序
网络字节序规定为大端字节序
如何验证x86平台下的字节序?
代码如下:
//file:01byteorder
#include<stdio.h>
#include<arpa/inet.h>
int main()
{
unsigned int x=0x12345678;
unsigned char *p=(unsigned char*)&x;
printf("x86字节序:");
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
unsigned int y=htonl(x);
printf("主机字节序->网络字节序:");
p=(unsigned char*)&y;
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
unsigned int z=ntohl(y);
printf("网络字节序->主机字节序:");
p=(unsigned char*)&z;
printf("%0x %0x %0x %0x\n",p[0],p[1],p[2],p[3]);
return 0;
}
则我们的预期目标是:78 56 34 12 ,那么x86为小端字节序:
综上所属:不同的硬件平台字节序是不一样的,这就需要字节序的转化
例如:电脑A和手机B进行通信,则需要如下转化
A端:主机字节序->网络字节序(小端字节序->大端字节序)
B端:网络字节序->主机自字节序(大端字节序->大端字节序)
相关文章推荐
- [置顶] Ajax核心--XMLHttpRequest对象
- TCP/IP远程访问操作:rwho,rlogin,rcp和rsh
- Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布
- 网络子系统6_设备开启与关闭
- 网络子系统5_设备队列规则
- 网络子系统4_以太网设备描述符
- 网络子系统3_do_softirq调用点
- 网络子系统2_设备子系统相关的初始化
- 网络子系统1_socket文件系统相关的初始化
- reDuh建立HTTP隧道
- 开博首记
- Ruby使用HTTP协议发送请求
- Ajax学习小例
- TCP和UDP基本原理
- 我的WCF开发框架简化版及基于NET.TCP传输方式的实现
- 我的WCF开发框架简化版及基于NET.TCP传输方式的实现
- 网络安全必修精品视频课程(共172课时),专家推荐
- 网络安全必修精品视频课程(共172课时),专家推荐
- java读取http请求中的body
- httpservlet