飞絮文博

专注于各种综合类资讯以及技术文章&优化等各类学习资讯

« 免费获取avast! Internet Security V6.0.1203许可证8088 汇编跳转 »

字节序的问题

大端、小端: 
    大小端是指CPU存储数据的方式,比如一个0x01020304这个整数,在WIN、Linux下在内存中的布局如下 
   [01][02][03][04] 注意左边是高地址,而右边是低地址 
   在UNIX下则是 
   [04][03][02][01] 注意左边是高地址,而右边是低地址 

   通俗的说,和WIN下的内存布局一致的就是小端,和UNIX下一致的就是大端。 
   其实在以前还出现过中端的的机型,不过这些机型也太“孤僻”了,已经落伍没人生产没人用了。 

网络字节序: 
   其实是指网络传输的字节序,这个字节序可能是大端序或者小端序,这取决于软件开始时通讯双方的协议规定。 
   平时,如果有人说的网络字节序,那么大家就认为是大端序。 

主机字节序: 
   是指主机处理数据时采用的字节序,虽然主机字节序和网络字节序是相对的概念,但是我们说主机字节序的时候,并不默认是之大端或者小端,而是结合机型来确定大小端的。 

位序: 
   我们通常所说的字节序是指字节之间的关系,但是即使是一个字节中的某一位(bit)也是有排序的问题的。位序也有大端序,小端序,中端序,也还有其他的乱七八糟的位序的,但是都不常见。 
   开发的时候,我们是不用关心位序,编译器和CPU会自己处理这些事情。 

算术运算与内存操作运算: 
   算术运算是不改变被运算数据的字节序的,此时我们不用关心所操作的数据到底是什么字节序的。但是内存操作运算就要注意了,比若我们将一个整数指针强制转换为一个字符指针类型,然后对字符指针类型的四个字节进行算数运算,此时我们必须知道是什么字节序。不然写出的代码要么是错误的,要么移植到其他机器的时候就不能正常运行。 
   常见的算术有+ - * / % & | ~ << >> = 等,请注意& | ~ << >> 这几个是算术运算而不是内存操作运算,所以他们进行混合运算的时候不用关心字节序或者位序问题。赋值运算符仅在数据类型兼容的时候才不涉及字节序问题,才能算作算术运算。 
   常见的内存操作运算有:强制转换后对碎片数据的算术运算,内存copy/write,读写文件等。 

浮点数的字节序: 
   浮点数......我也不知道应该怎么处理其字节序问题,网上也查了很久但是没有很权威的答案。对于浮点数,我建议不要直接传内存值,按照字符串传输即可。 

IP地址的字节序: 
  记住一条,IP地址的整数值,自IP地址生成的时刻起,就一定是网络字节序的,所以我们在转字节序的时候,IP 地址我们往往跳过对IP地址的字节序转换。呵呵,IP地址已经是网络字节序了,所以我们仅需要做算术赋值操作即可。 

字节序转换函数: 
   OS一般都提供htons、htonl、ntohs、ntohl这四个字节序操作函数,这些函数的目的虽然相同,而且操作后内存布局也相同,但是从算术运算的角度来看这些函数的特性是与机型相关的:在WIN下这四个函数会改变所操作的数的数值,但是在UNIX下就不回改变数据的算术值,UNIX下这些函数是空操作。这个差别也可能是为什么UNIX服务器上程序的性能会高于WIN的一个小原因。 

 

以上文章来自于:KSSD



飞絮文博 - 版权声明
1、本网站所发文章,若有侵权请及时联系我;
2、其他单位或个人使用、转载或引用本文时必须同时征得本博客的同意;
3、若由其他人转载所引起的任何纠纷,本网站概不负责;
4、本网站部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

加入您的收藏     设为您的主页

日历

最新评论及回复

最近发表

联系邮箱:[email protected] , Powered By 飞絮视频乐园 , 鲁ICP备08128977号 , 值班站长:
本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.
This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.

_×
博主强烈推荐
等待您的加盟,MV美女图库网是一个MV|美女|AV美女,美女图库下载网,集合所有美女、风景、壁纸下载网。