网络字节序与主机字节序
2010-08-03 11:14
267 查看
1、
本地字节序
由
于不同的计算机系统采用不同的字节序存储数据,同样一个4字节的32位整数,在内存中存储的方式就不同. 字节序分为小尾字节序(Little
Endian)和大尾字节序(Big Endian), Intel处理器大多数使用小尾字节序,
Motorola处理器大多数使用大尾(Big Endian)字节序;
小尾就是低位字节排放在内存的低端,高位字节排放在内存的高端。例如一个4字节的值为0x1234567的整数与高低字节对应关系:
将在内存中按照如下顺序排放:
如果有char a[2]={0x9c, 0x88},则直接转换为unsigned short int之后的值为 *((unsigned short int *)aa) == 0x889c
大尾就是高位字节排放在内存的低端,低位字节排放在内存的高端。例如一个4字节的值为0x1234567的整数与高低字节对应关系:
将在内存中按照如下顺序排放:
2、
网络字节序
TCP/IP
各层协议将字节序定义为大尾,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
3、
字串在内存中的存储(intel系列)
字串和整数是相反的,是安字串的索引从低到高存储到内存中的;
char s[4] =
“abc”;
将在内存中按照如下顺序排放:
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位无符号整数从网络字节序转换成本地字节序
转自 http://blog.sina.com.cn/s/blog_4c8b12b90100hjww.html
本地字节序
由
于不同的计算机系统采用不同的字节序存储数据,同样一个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 |
网络字节序
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 |
{
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位无符号整数从网络字节序转换成本地字节序
转自 http://blog.sina.com.cn/s/blog_4c8b12b90100hjww.html
相关文章推荐
- 网络字节序与主机字节序
- 网络字节序和主机字节序
- 关于网络字节序(network byte order)和主机字节序(host byte order)
- 网络字节序与主机字节序
- 主机字节序与网络字节序
- 网络字节序与主机字节序的转换
- 网络字节序与主机字节序
- 网络字节序与主机字节序的转换
- 网络字节序与主机字节序
- 网络字节序与主机字节序的转换
- 网络字节序与主机字节序
- 网络字节序与主机字节序
- 什么是网络字节序,主机字节序??
- 网络字节序与主机字节序
- 网络字节序和主机字节序
- 大端 、小端、主机字节序、网络字节序
- 网络字节序与主机字节序
- 关于网络字节序和主机字节序
- 大端字节序、小端字节序、主机字节序、网络字节序
- 网络字节序与主机字节序