字节顺序 big-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 91149
  • 博文数量: 14
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-13 21:27
文章分类

全部博文(14)

文章存档

2008年(14)

我的朋友
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: c/c

2008-08-31 00:50:14

1,什么是字节顺序

指的就是数据在内存里存储的顺序,通常我们默认一个存储单元为1byte,一个逻辑数据比如float是4个byte,它在内存理存储的顺序可以是高位在前,也可以是低位在前.这样就有区分了.

2,有些什么顺序:

big-endian(msb),高位在低地址

little-endian(lsb),低位在低地址

endian指的是当物理上的最小单元比逻辑上的最小单元小时,逻辑到物理的单元排布关系

3,为什么要有字节顺序?

因为程序需要与外界通讯,传送数据,这里的外界包括其他机器和其他语言写的程序.比如x86下c 程序与linux底下的程序通讯,比如c 和java的程序通讯.都会涉及到字节存放顺序的问题.

3,哪些会是big-endian,哪些会是little-endian

网络协议都是big-endian的,java编译的都是big-endian的

motorola的powerpc是big-endian的

x86系列则采用little-endian方式存储数据。

arm同时支持 big和little,实际应用中通常使用little-endian

4,如何判断我现在的系统里采用什么字节存储顺序?

/*用于判断存储格式是little endian还是big ednian的c代码*/
#include "stdafx.h"

using namespace std;

union
{
long   long;
char   char[sizeof(long)];
} u;

void   main()
{
   u.long=1;
   if(u.char[0]==1)
   {
    printf("little endian!"n");

   }
   else if(u.char[sizeof(long)-1]==1)
   {
    printf("big endian!"n");
   }
   else
   {
    printf("unknown addressing!"n");
   }

   printf("now,let's look at every byte in the memory!"n");
  
   for(int i=0;i    {
    printf("[%x]=%x"n",&u.char[i],u.char[i]);
   }

   getchar();
   return;
}

5,如何转换字节顺序,big-endian-->little-endian or little endian->big endian.

#include
const unsigned char size_of_unsignedint = sizeof(unsigned int);
const unsigned char size_of_unsignedchar = sizeof(unsigned char);

void put_32(unsigned char * cmd, unsigned int data)
{
    int i;
    for (i = size_of_unsignedint - 1 ; i >= 0 ; --i)
    {
     cmd[i] = data % 256 ;
      // 或者可以:
      // cmd[i] = data & 0xff;
     data = data >> 8 ;
    }
}

unsigned int get_32(unsigned char * cmd)
{
    unsigned int ret;
    int i;
    for (ret = 0 , i = size_of_unsignedint - 1 ; i >= 0 ; -- i)
    {
     ret = ret << 8 ;
     ret |= cmd[i];  
    }  
    return ret;
}

int main( void)
{
   unsigned char cmd[size_of_unsignedint];
   unsigned int data, ret;
   unsigned char * p;
   int i;
   data = 0x12345678 ;
   printf( "data = %x"n " , data);
    // 以字节为单位打印出数据
    p = (unsigned char *)( & data);
    for(i = 0 ; i < size_of_unsignedint; i)
    {
   printf( " %x " , * p );
    }
    printf( " "n ");
    //以相反的顺序存放到cmd之中
    put_32(cmd, data);
    for (i = 0 ; i < size_of_unsignedint; i)
    {
    printf( " cmd[%d] = %x"n " , i, cmd[i]);
    }
    // 再以相反的顺序保存数据到ret中
    // 保存之后的ret数值应该与data相同
    ret = get_32(cmd);
    printf( " ret = %x"n " , ret);
    p = (unsigned char *)( & ret);
    for(i = 0 ; i < size_of_unsignedint; i)
    {
    printf( " %x " , * p );
    }
    printf( " "n ");
    getchar();
    return 0 ;
}

阅读(2322) | 评论(0) | 转发(0) |
0

上一篇:vim资源

下一篇:没有了

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图