现在的位置: 首页 > 综合 > 正文

linux下的字节序转换

2013年08月16日 ⁄ 综合 ⁄ 共 1030字 ⁄ 字号 评论关闭
 如果你要尝试编写linux环境下的网络程序,那么一定会碰到这个字节序问题,

与其每次碰到的时候都去查找资料,不如一劳永逸,所以就做了一个简图,可以

作为随手查看的资料,这里所说的均在自己的机器上验证过,但也都是个人的理解,

难免有误。

         字节序,就是计算机在安排数据类型存储的时候,怎样存储数据的高低位。其实这

一般和操作系统没有关系,而是和计算机的硬件架构有关,具体的说,就是CPU的设计

有关,英特尔的芯片和AMD的芯片组都是使用的小端字节序(最低字节优先存储),

但是有些特别的CPU就不是这样处理的。它们可能使用大端字节序(最高字节优先存储),

这些在不同计算机上使用的字节序称为主机字节序。

         另外应明确,计算机CPU可以支持的最基本数据存储是一个字节,数据位的操作使用

了特殊的寄存器。所以涉及到字节序问题的数据类型,一定是整字节的倍数,不可能是4bits。

也不可是一个字节,六进制表示起来就是:一个数据0XAB,不可能使用字节序转换为0XBA。

        为了在不同架构的计算机之间通信,那么网络上的字节序就必须统一,网络字节序使

用的是大端字节序(最高字节优先存储),所以我们通常要在程序中做字节序转换,但是

为了方便程序的移植,基本上涉及到这类操作的地方都要进行字节序转换。     字节序的转

换,是当程序在系统上动态运行时进行的,它会根据当前CPU的运行模式来决定转换还是

不转换,所以使用字节序转换函数时非常必要的,这让我们的程序移植很容易。

       下图给出了很详细的处理函数和相关的数据变化:

图中给出了各种资料中常见的名词,它们其实都是指一个东东啊!       
对于,数据在网络中数据是怎么存储的,笔者这样理解,在网关,或者其他网络设备中,
在进行数据过滤等处理时可能存在不同的字节序,但是到达我们网卡的数据一定是按照网
字节序来存储数据的,当NIC收到一个数据包的时候,它申请一块内存区,然后存入数
据,这时候数据都是按照网络字节序来存储的,当我们的软件进程要读取这里的数据的时
候,CPU将找到地址,并根据指令来读取一定的字节数,这个时候,如果我们没有进行字
节序转换,并且主机字节序与网络字节序不同,那么问题就出现了,对于CPU来说,假设
它一贯(也只能,设计的时候就确定了)从高地址读取并作为数据的高位,那么一切数据
都是错误的了,所以,转换函数又开辟了一块内存,并将数据的序列完全翻转过来,这样
CPU来读这块数据就是正确的了。 

抱歉!评论已关闭.