字节序的问题

 

大端,小端

    大小端是指CPU存储数据的方式,比如一个0x01020304这个证书,在windows,Linux下在内存中的布局如下:

            [01][02][03][04]   注意左边是高地址, 而右边是低地址

    在UNIX下则是:

           [04][03][02][01]    注意左边是高地址, 而右边是低地址

    通俗的说, 和windows下的内存布局一致的就是小端, 和UNIX下一致的就是大端.

    其实在以前还出现过中端的机型, 不过这些机型也太"孤僻"了, 已经落伍没人生产没人用了.

 

网络字节序

    其实是指网络传输的字节序, 这个字节序可能是大端序或者小端序, 这取决于软件开始时通讯双方的协议规定.

    平时, 如果有人说的网络字节序, 那么大家就认为是大端序.

 

主机字节序

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

 

位序

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

 

算术运算与内存操作运算

    算术运算是不改变被运算数据的字节序的,此时我们不用关心所操作的数据到底是什么字节序的。但是内存操作运算就要注意了,比若我们将一个整数指针强制转换为一个字符指针类型,然后对字符指针类型的四个字节进行算数运算,此时我们必须知道是什么字节序。不然写出的代码要么是错误的,要么移植到其他机器的时候就不能正常运行。 

    常见的算术有+ - * / % & | ~ << >> = 等,请注意& | ~ << >> 这几个是算术运算而不是内存操作运算,所以他们进行混合运算的时候不用关心字节序或者位序问题。赋值运算符仅在数据类型兼容的时候才不涉及字节序问题,才能算作算术运算。

    常见的内存操作运算有:强制转换后对碎片数据的算术运算,内存copy/write,读写文件等。 

浮点数的字节序

   

IP地址的字节序

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

 

字节序转换函数

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值