Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28261
  • 博文数量: 13
  • 博客积分: 653
  • 博客等级: 上士
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-25 21:20
文章分类
文章存档

2011年(2)

2010年(11)

我的朋友

分类: LINUX

2010-06-20 23:55:01

在网络编程中,必然会不可避免字节序的问题。
字节序,字节在内存中的存放顺序,当然一个字节的数据不必考虑字节序的问题。
字节序分为两类,Big-Endian(Motorola的PowerPC系列CPU),little-Endian(Intel的x86系列CPU)。
两种字节序的解释如下:
1.Big-Endian,内存低地址存放最高有效字节,内存高地址存放最高有效字节。
2.Little-Endian,内存低地址存放最低有效字节,内存高地址存放最高有效字节。
举例,比如数据0x12345678对于两种不同的字节序在内存中的数据存放顺序如下图所示:
 
Big-Endian
低地址                   高地址
---------------------------->
+++++++++++++++++++++++++++++
|  12  |  34  |  56  |  78  |
+++++++++++++++++++++++++++++
 
Little-Endian
低地址                   高地址
---------------------------->
+++++++++++++++++++++++++++++
|  78  |  56  |  34  |  12  |
+++++++++++++++++++++++++++++
            图 1
从上图可以看出,采用Big-Endian方式存储数据是符合人类的思维习惯,对于一个字节的数据,其字节内的8个比特之间也存在比特序的问题,不多介绍,详情请Google之。
判断一个CPU的字节序是Big-Endian,还是Little-Endian,下面是详细的代码:
 
1.
 
#include
#include
#include
 
int main()
{
    int i = 1;
    char *cp = (char *)&i;
    if(*cp)
        printf("Little-Endian\n");
    else
        printf("Big-Endian\n");
    return 0;
}
 
2.
 
#include
#include
#include
union
{
    int a;
    char b[sizeof(int)];
}u;
int main()
{
    u.a = 1;
    int i = 0;
    if(u.b[0] == 1)
    {
        printf("Little-Endian\n");
    }
    else if(u.b[sizeof(int) - 1] == 1)
    {
        printf("Big-Endian\n");
    }
    else
        printf("Unknown Endian\n");
    printf("Now,look at every byte in the memory\n");
    for(i=0;i
    {
        printf("Address:%p,Value:%x\n",&u.b[i],u.b[i]);
    }
    return 0;
}
 
3.
 
#include
int main()
{
    int i = 0x0001;
    (char)i?printf("Little-Endian\n"):printf("Big-Endian\n");
    return 0;
}
阅读(648) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Nginx相关

给主人留下些什么吧!~~