字节序与位序
来源:互联网 发布:岛崎遥香握手数据切 编辑:程序博客网 时间:2024/04/27 23:04
字节序
程序1清单:
#include
#include
int
{
}
现在来分析一下这段代码
首先,定义了一个字符数组input,用来接收用户输入的4个数字字符;
第二,把4个字符数字转换成对应的数字;
第三,把转换的数字复制到整型变量integer中;
最后在屏幕上打印。
如果在PPC或者ARM的机器上编译运行这个程序,那么会在屏幕上打印出结果:0x01020304,这与我们的预期一致;但是在X86的机器上则打印出的结果是:0x04030201。这个令人惊讶的结果正是字节序问题引起。下面来详细谈谈这个问题。
可以看到,在小端序的计算机中,0x01020304的保存顺序恰好与上面的程序1中相反,这就是最后输出结果为0x04030201的原因;大端序的计算机中两者保存顺序一致,所以打印正确。
程序2清单:
#include
int
{
}
再看看如何才能让程序1在大端序和小端序的机器上都能正确执行呢?一个办法就是利用预编译宏,针对不同的机器定义定义不同的数据结构。下面是一个例子:
程序3清单:
#include
#include
typedef
{
#ifdef
#else
#endif
} INTEGER;
int
{
}
可以看到,这段代码定义了两套数据结构,通过BIG_ENDIAN这个宏定义来决定使用哪一套数据结构。这是个笨拙却有效的方法。下面这个例子则漂亮一些:
程序4清单
#include
#include
#include
#include
int
{
}
这个程序利用了大端序与人类书写习惯一致的特点,通过ntohl函数将整数进行转换。这个函数的功能是将网络序转换成主机序,在大端机器上它什么也不做,在小端机器上它会将输入参数的值转换成小端序的值。在windows环境下链接时别忘了将Ws2_32.lib库添加进来。
主机序和网络序
主机序就是指主机的端序。
网络字节序(网络序)指多字节数据在网络传输中的顺序,TCP协议规定网络序是大端序,即高字节先发送。因此大端序的机器接受到的数据可直接使用,小端序机器则需要转换后使用。BSD socket API中定义了一组转换函数,用于16和32bit整数在网络序和本机字节序之间的转换。htonl,htons用于本机序转换到网络序;ntohl,ntohs用于网络序转换到本机序。一般来说,为了保证程序的可移植性,编写代码时,发送的数据需要使用htonl、htons转换,接收到的数据要使用ntohl、ntohs转换。
注意:不存在对单字节整数进行转换的函数”ntohc”和”htonc”!
位序
现代计算机的最小存储单位是BYTE,无法对bit寻址,因此我们无法直接观察每个字节内部bit的顺序。但是我们仍然可以通过位域来间接观察字节内部bit顺序,以印证上面的说法。
在C语言中,位域与结构体类似,其语法规定:先声明的成员位于低地址,后声明的成员位于高地址。那么下面的位域中:
typedef
{
}
成员bt0就位于一个字节中最低地址bit0处,成员bt7就位于一个字节的最地址bit7处。
我们看看下面的程序。
#include
typedef
{
}
int
{
}
当bt7赋值为1后,onebyte在内存中是这个样子的:
而在VC2005中编译运行的结果如下 :
0x80转换成二进制是1000
- 字节序与位序
- 字节序与位序
- 字节序与位序
- 网络字节序与主机字节序 高低位
- 64位网络字节序与主机字节序转换
- 64位网络字节序与主机字节序转换
- 字节序、位序
- 字节序、位序
- 字节序、位序
- 字节序&位序
- 字节序&位序
- 高低位字节序
- 字节对齐&位域&字节序
- [转]字节序与位序的统一性
- C位域与大小端字节序 间关系
- [转]字节序、位序
- 32位字节序转换
- 位与字节
- 1113
- Unity3D中脚本的执行顺序和编译顺序
- Normalize.css – 现代 Web 开发必备的 CSS resets
- 第十二周项目一阅读程序(2)②
- init.rc文件里面启动c++程序,通过jni调用java实现
- 字节序与位序
- windows和linux双系统修改启动项顺序
- Video Google: A Text Retrieval Approach----词频那部分解释
- 第十二周项目1观察静态变量的存储特征
- 解决MySQL远程连接不上的问题
- 本地lan网络中,目标硬件地址与源硬件地址都是两个PC自身的
- mysql备份还原-mysqldump实例
- maven环境快速搭建
- 《数据结构》实验四 字符串和多维数组 实验