网络编程是为什么要考虑字节序问题
3个回答
展开全部
CPU(对 就是CPU)不同 字节序不同的
什么是字节序
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。其实大部分人在实际的开 发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。
在所有的介绍字节序的文章中都会提到字 节序分为两类:Big-Endian和Little-Endian,引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
Big-Endian
计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最重要字节(MSB)存放在最低端的地址 上。采用这种机制的处理器有IBM3700系列、PDP-10、Mortolora微处理器系列和绝大多数的RISC处理器。
Little-Endian
计算机体系结构中 一种描述多字节存储顺序的术语,在这种机制中最不重要字节(LSB)存放在最低端的地址上。采用这种机制的处理器有PDP-11、VAX、Intel系列 微处理器和一些网络通信设备。该术语除了描述多字节存储顺序外还常常用来描述一个字节中各个比特的排放次序。
除了Big-Endian和Little-Endian之外的多字节存储顺序就是Middle- Endian,比如以4个字节为例:象以3-4-1-2或者2-1-4-3这样的顺序存储的就是Middle-Endian。这种存储顺序偶尔会在一些小 型机体系中的十进制数的压缩格式中出现。
什么是字节序
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。其实大部分人在实际的开 发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。
在所有的介绍字节序的文章中都会提到字 节序分为两类:Big-Endian和Little-Endian,引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian,因此TCP/IP协议中使用的字节序通常称之为网络字节序。
Big-Endian
计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最重要字节(MSB)存放在最低端的地址 上。采用这种机制的处理器有IBM3700系列、PDP-10、Mortolora微处理器系列和绝大多数的RISC处理器。
Little-Endian
计算机体系结构中 一种描述多字节存储顺序的术语,在这种机制中最不重要字节(LSB)存放在最低端的地址上。采用这种机制的处理器有PDP-11、VAX、Intel系列 微处理器和一些网络通信设备。该术语除了描述多字节存储顺序外还常常用来描述一个字节中各个比特的排放次序。
除了Big-Endian和Little-Endian之外的多字节存储顺序就是Middle- Endian,比如以4个字节为例:象以3-4-1-2或者2-1-4-3这样的顺序存储的就是Middle-Endian。这种存储顺序偶尔会在一些小 型机体系中的十进制数的压缩格式中出现。
展开全部
不同的CPU有不同的字节顺序类型的字节顺序是存储在内存中的整数序列被称为宿主音序器
最常见的,有两个
1。小尾:低序字节存储在起始地址
2。大端:高位字节存储在起始地址
LE little-endian的
大多数人的思维的字节顺序
地址的低存储值低
解决了高存储值高
怎么说是最符合人的思维的字节顺序,因为从第一知觉的人
低价值,应该被放置在内存地址小的地方,存储器地址低字节
相反,一个高值应该被放置在大的内存地址,内存地址的高
BE big-endian的
最直观的字节顺序
地址的低存储值高
解决了高存储值低
为什么是直观的,不考虑之间的对应关系
只需要写存储器地址由左到右的顺序按照从低到高
按照通常高至低写入的顺序中的值
这两种控制字节填充字节内
实施例:0x01020304(DWORD)的双字存储在内存中的
内存地址
4,000,400,140,??024,003
LE 04 03 02 01
01 02 03 04
例:如果和,我们将0x1234abcd写入到内存开始为0x0000,其结果是
????的big-endian little-endian的
0X0000 0X12 0xcd
0×0001 0X23 0xab
0002 0xab 0x34
0x0003 0xcd 0X12
x86系列CPU是little-endian字节顺序。
大端小端转换的方法:
??Big-Endian的Little-Endian的转换如下:
#定义BigtoLittle16(A)((((UINT16)(A)&0xff00)>> 8)|
??????????????(((UINT16)(A)到0x00FF之间)<< 8))
#定义BigtoLittle32(A)((((UINT32)(A)为0xff000000)>> 24)|
??????????????(((UINT32)(A)&0x00ff0000)>> 8)
??????????????(((UINT32)(A)0x0000ff00)<< 8)|
??????????????(((UINT32)(A)&0x000000ff)<< 24))
大端小端的检测方法:
如何检查处理器是big-endian或little-endian?
联合体工会成员使用此功能从低地址存储的存储顺序,你可以很容易地访问CPU内存小端或大端模式来读取和写入。
INT checkCPUendian()
{
?工会
?{
??unsigned int类型了;
??无符号字符型B;
?} C;
?c.a = 1;
?返回(c.b == 1);
}
网络字节顺序
TCP / IP网络字节顺序需要良好的数据表示格式,它没有任何与特定的CPU类型,操作系统,它可以确保数据可以被不同的主机之间传输的正确解释。网络字节顺序是big endian排序。
为了进行转换的BSD socket转换功能提供了以下四个
htons unsigned short类型顺序从主机序转换到网络
htonl无符号长型序列从主机序转换到网络
还有ntohs unsigned short类型从网络顺序转换到宿主音序器
ntohl相似,无符号长整型类型从网络顺序转换到宿主音序器
使用little endian字节顺序转换这些功能的系统
这些功能使用的大端类型系统将被定义为一个空的宏
同一个网络程序开发和跨平台的发展,也应采取措施,确保只有一个字节顺序或双方的解释是不一样的,因为发生错误。
最常见的,有两个
1。小尾:低序字节存储在起始地址
2。大端:高位字节存储在起始地址
LE little-endian的
大多数人的思维的字节顺序
地址的低存储值低
解决了高存储值高
怎么说是最符合人的思维的字节顺序,因为从第一知觉的人
低价值,应该被放置在内存地址小的地方,存储器地址低字节
相反,一个高值应该被放置在大的内存地址,内存地址的高
BE big-endian的
最直观的字节顺序
地址的低存储值高
解决了高存储值低
为什么是直观的,不考虑之间的对应关系
只需要写存储器地址由左到右的顺序按照从低到高
按照通常高至低写入的顺序中的值
这两种控制字节填充字节内
实施例:0x01020304(DWORD)的双字存储在内存中的
内存地址
4,000,400,140,??024,003
LE 04 03 02 01
01 02 03 04
例:如果和,我们将0x1234abcd写入到内存开始为0x0000,其结果是
????的big-endian little-endian的
0X0000 0X12 0xcd
0×0001 0X23 0xab
0002 0xab 0x34
0x0003 0xcd 0X12
x86系列CPU是little-endian字节顺序。
大端小端转换的方法:
??Big-Endian的Little-Endian的转换如下:
#定义BigtoLittle16(A)((((UINT16)(A)&0xff00)>> 8)|
??????????????(((UINT16)(A)到0x00FF之间)<< 8))
#定义BigtoLittle32(A)((((UINT32)(A)为0xff000000)>> 24)|
??????????????(((UINT32)(A)&0x00ff0000)>> 8)
??????????????(((UINT32)(A)0x0000ff00)<< 8)|
??????????????(((UINT32)(A)&0x000000ff)<< 24))
大端小端的检测方法:
如何检查处理器是big-endian或little-endian?
联合体工会成员使用此功能从低地址存储的存储顺序,你可以很容易地访问CPU内存小端或大端模式来读取和写入。
INT checkCPUendian()
{
?工会
?{
??unsigned int类型了;
??无符号字符型B;
?} C;
?c.a = 1;
?返回(c.b == 1);
}
网络字节顺序
TCP / IP网络字节顺序需要良好的数据表示格式,它没有任何与特定的CPU类型,操作系统,它可以确保数据可以被不同的主机之间传输的正确解释。网络字节顺序是big endian排序。
为了进行转换的BSD socket转换功能提供了以下四个
htons unsigned short类型顺序从主机序转换到网络
htonl无符号长型序列从主机序转换到网络
还有ntohs unsigned short类型从网络顺序转换到宿主音序器
ntohl相似,无符号长整型类型从网络顺序转换到宿主音序器
使用little endian字节顺序转换这些功能的系统
这些功能使用的大端类型系统将被定义为一个空的宏
同一个网络程序开发和跨平台的发展,也应采取措施,确保只有一个字节顺序或双方的解释是不一样的,因为发生错误。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为在运行的时候要cpu要分配空间。需要多少就定义多大的字节。否则,会造成运行是占用很大的运行空间的现象。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询