博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字节序和网络字节序【转】
阅读量:7175 次
发布时间:2019-06-29

本文共 2133 字,大约阅读时间需要 7 分钟。

1       字节序
由于不同的计算机系统采用不同的字节序存储数据,同样一个4字节的32位整数,在内存中存储的方式就不同. 字节序分为
小尾字节序(Little Endian)和大尾字节序(Big Endian), Intel处理器大多数使用小尾字节序, Motorola处理器大多数使用大尾(Big Endian)字节序;
小尾就是低位字节排放在内存的低端,高位字节排放在内存的高端。例如一个4字节的值为0x1234567的整数与高低字节对应关系:
01
23
45
67
Byte3
Byte2
Byte1
Byte0
高位字节-- à --------- à -------------- à 低位字节
 
将在内存中按照如下顺序排放:
内存地址序号
字节在内存中的地址
16 进制值
0x03
Byte3
01
0x02
Byte2
23
0x01
Byte1
45
0x00
Byte0
67
 
 
大尾就是高位字节排放在内存的低端,低位字节排放在内存的高端。例如一个4字节的值为0x1234567的整数与高低字节对应关系:
01
23
45
67
Byte3
Byte2
Byte1
Byte0
高位字节-- à --------- à -------------- à 低位字节
将在内存中按照如下顺序排放:
内存地址序号
字节在内存中的地址
16 进制值
0x03
Byte0
67
0x02
Byte1
45
0x01
Byte2
23
0x00
Byte3
01

 

2       网络字节序
TCP/IP 各层协议将字节序定义为大尾,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
 
3       字串在内存中的存储(intel系列)
     字串和整数是相反的,是安字串的索引从低到高存储到内存中的;
     char s[4] =  “abc”;  
a
b
c
/0
s[0]
s[1]
s[2]
s[3]
 
 
将在内存中按照如下顺序排放:
内存地址序号
16 进制值
指针P的位置
0xbffeadf7
/0
p+3
0xbffeadf6
c
p+2
0xbffeadf5
b
p+1
0xbffeadf4
a
p
 
int main(void)
{
     char s[4] = "abc";
     char *p = s; 
     printf("%02x, %02x,    %02x,    %02x/n", &s[0], &s[1], &s[2], &s[3]);
     printf("%02x, %02x,    %02x,    %02x/n", p, p+1, p+2, p+3);
     printf("%c,   %c, %c, %c/n", s[0], s[1], s[2], s[3]);
        
     return 0;
}
输出结果:
[netcool@HFINMSP2 demo]$ ./demo001
bffeadf4,       bffeadf5,       bffeadf6,       bffeadf7
bffeadf4,       bffeadf5,       bffeadf6,       bffeadf7
a,      b,      c,
4       整数数组在内存中的存储(intel系列)
同字串一样,但是数组里的每一个整数的存储是按照小尾字节序;
 
5       linux系统中的处理方法
网络字节序作为一个标准字节序,如果系统并没有提供相关的转换函数,我们可以通过以下4个宏实现本地字节序和网络字节序的相互转换:
htons(): 将16位无符号整数从本地字节序转换成网络字节序
htonl(): 将32位无符号整数从本地字节序转换成网络字节序
ntohs(): 将16位无符号整数从网络字节序转换成本地字节序
ntohl(): 将32位无符号整数从网络字节序转换成本地字节序
 
注:1、网络与主机字节转换函数:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)2、不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。处理器     操作系统     字节排序Alpha     全部     Little endianHP-PA     NT     Little endianHP-PA     UNIX     Big endianIntelx86     全部     Little endian <-----x86系统是小端字节序系统Motorola680x()     全部     Big endianMIPS     NT     Little endianMIPS     UNIX     Big endianPowerPC     NT     Little endianPowerPC     非NT     Big endian   <-----PPC系统是大端字节序系统RS/6000     UNIX     Big endianSPARC     UNIX     Big endianIXP1200 ARM核心     全部     Little endian

转载于:https://www.cnblogs.com/zhangpengme/archive/2012/10/28/2743237.html

你可能感兴趣的文章
Linux命令之kill
查看>>
Asp.Net SignalR Hub类中的操作详解
查看>>
附上解决迅雷9及迅雷极速版任何资源下载任务出错、内容违规问题
查看>>
hadoop3: mkdir: cannot create directory `/usr/local/hadoop/bin/../logs’: Permission denied
查看>>
高阶函数与面向对象继承的比较
查看>>
群雄逐鹿的移动互联网时代【转载】
查看>>
【排序】InsertSort
查看>>
[c++11]多线程编程(五)——unique_lock
查看>>
高程3总结#第15章使用Canvas绘图
查看>>
【go并发编程】
查看>>
实验吧——隐写术之流
查看>>
Ionic 2 开发(一)_安装与目录结构
查看>>
浅谈内存泄露
查看>>
记录 xcode 配置build自增长
查看>>
用C#开发较完整的Windows任务管理器
查看>>
《Learning Scrapy》(中文版)第1章 Scrapy介绍
查看>>
单点登录原理与实现
查看>>
初探Java设计模式4:JDK中的设计模式
查看>>
漫谈promise使用场景
查看>>
Design Pattern的万剑归宗 => Mediator
查看>>