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位无符号整数从网络字节序转换成本地字节序
分享到:
相关推荐
本地字节序和网络字节序.pdf,如题,介绍网络字节序
在上一篇文章网络编程:主机字节序和网络字节序中,介绍了主机字节序和网络字节序的基本概念以及在实际的编程中,何时需要进行网络字节序和主机字节序的转换。本篇文章着重介绍使用c++和python语言,如何实现主机...
IP、主机字节序、网络字节序、互转 ------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using ...
对字节序的一些理解。
字节序 大小端 网络编程 字节序 大小端 网络编程
利用宏将网络字节序和主机字节序ip格式化输出为字符串ip
网络字节序与主机字节序
主机字节序和网络字节序 主机字节序即内存中存储字节的方法有: 1. Little endian:将低序字节存储在起始地址 2. Big endian:将高序字节存储在起始地址 网络字序表示网络协议在处理多字节时的顺序,一律为big ...
网络字节序 主机字节序
项目中需要64位数的字节序转换,主机序转换成网路序或者相反转换,写了2个函数,有需要的可以参考。
大小端字节序的介绍和相互转换。在c++中,有4个函数可以实现主机字节序到网络字节序的相互转换。
在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。 一般而言,字节序指示了一个UCS-2字符的...
Linux 网络编程——网络字节序、地址转换,相关教程链接如下: http://blog.csdn.net/tennysonsky/article/details/45045549
网络中表示的IP地址与主机表示不同,本程序通过转换来表示。
尾数 一个小的golang库,可帮助处理主机到网络和网络到主机的字节序转换免责声明在使用此库之前,请阅读并了解Rob Pike的有关的博客文章。 长话短说,每当您需要担心代码是在小型字节序还是大型字节序计算机上运行时...
本资源是ruby代码,提供了一系列封装好...二进制字符串与整数互转,包括uint8,uin16,uint32, 以及本地字节序和网络字节序两种二进制字符串与整数的互转。这些工具函数对于要处理二进制字符串时很好用,是我多年的积累。
关于字节序(大端法、小端法)的定义《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;...网络字节序 我们知道网络上的数据流是
判断网络字节序大小端简易程序,tcp连接监听...(Linux高性能网络编程第三版第五章源码)
5.4 主机字节序和网络字节序 163 5.4.1 字节序的含义 164 5.4.2 网络字节序的转换 164 5.5 小结 166 第6章 应用层网络服务程序简介 167 6.1 HTTP协议和服务 167 6.1.1 HTTP协议概述 167 6.1.2 HTTP...
举例而言,有一个4字节的数据0x01020304,要存储在内存中或文件中编号0~3字节的位置,两种字节序的排列方式分别如下:Big Endian 低地址