文档章节

关于大、小端问题

01010101010101010101
 01010101010101010101
发布于 2014/01/03 21:19
字数 564
阅读 11
收藏 0

一、概念及详解

  在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。

  先回顾两个关键词,MSB和LSB:

  MSB:MoST Significant Bit ------- 最高有效位
        LSB:Least Significant Bit ------- 最低有效位

  大端模式(big-edian)

  big-endian:MSB存放在最低端的地址上。

  举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:

| data |<-- address
        | 0x12 |<-- 0x00002000
        | 0x34 |<-- 0x00002001

  在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):

bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15
        ------MSB----------------------------------LSB
        val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
        +--------------------------------------------+
        = 0x8 B 8 A

  小端模式(little-endian)

  little-endian:LSB存放在最低端的地址上。

  举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:

| data |<-- address
        | 0x34 |<-- 0x00002000
        | 0x12 |<-- 0x00002001

  在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):

bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
        ------MSB-----------------------------------LSB
        val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
        +---------------------------------------------+
        = 0x8 B 8 A

  二、数组在大端小端情况下的存储:

  以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:
  Big-Endian: 低地址存放高位,如下:

高地址
        ---------------
        buf[3] (0x78) -- 低位
        buf[2] (0x56)
        buf[1] (0x34)
        buf[0] (0x12) -- 高位
        ---------------
        低地址

Little-Endian: 低地址存放低位,如下:

高地址
        ---------------
        buf[3] (0x12) -- 高位
        buf[2] (0x34)
        buf[1] (0x56)
        buf[0] (0x78) -- 低位
        --------------
        低地址

  三、大端小端转换方法:

  Big-Endian转换成Little-Endian如下:

#define BigtoLittle16(A)                 ((((uint16)(A) & 0xff00) >> 8) | \
                                                                   (((uint16)(A) & 0x00ff) << 8))
        #define BigtoLittle32(A)                 ((((uint32)(A) & 0xff000000) >> 24) | \
                                                                   (((uint32)(A) & 0x00ff0000) >> 8) | \
                                                                   (((uint32)(A) & 0x0000ff00) << 8) | \
                                                                   (((uint32)(A) & 0x000000ff) << 24))

  四、大端小端检测方法:

  如何检查处理器是big-endian还是little-endian?

  联合体uniON的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。

int checkCPUendian()
        {
                union
                {
                        unsigned int a;
                        unsigned char b;
                }c;
                c.a = 1;
                return (c.b == 1);
        }
        /*return 1 : little-endian, return 0:big-endian*/

 

© 著作权归作者所有

共有 人打赏支持
01010101010101010101
粉丝 23
博文 93
码字总数 68915
作品 0
长宁
高级程序员
微信公众平台使用JSSDK网页调起扫码并获取扫码数据(PHP实现)

微信公众平台使用JSSDK网页调起扫码并获取扫码数据 初学者,部分css样式在网上扒下来的,功能实现了,代码很糙,非常糙,望海涵,也希望大神多指导 得到你的APPID与AppSecret 获取到access_...

微信公众平台
2017/12/06
0
0
RocketMQ重复消息终极解决方案

关于RocketMQ的基本原理与实践,可拜读大神的文章:分布式开放消息系统(RocketMQ)的原理与实践 大神的文章分析了RocketMQ实现顺序消息的原理,由此引出一个新问题:如何解决重复消息问题? ...

谁与问天
2017/08/07
0
0
跟你请教个关于openfire的问题~

@大苹果 你好,想跟你请教个问题: 请问你一下关于openfire的问题,看你是以前也遇到过这样的问题吧,就是客户端掉线了,服务端无法马上知道客户端已经掉线,这时候发的离线消息是收不到的。...

LeeShanshan
2014/07/23
35
0
primefaces_mobile如何实现跳转查询

第一个实习,公司要我学primefaces帮公司的ERP系统做一个手机端。。。可是我连jsf都没接触过阿 然后问题来了,就是如何实现在一个页面中,page1有许多带不同查询条件的commandbutton,点击以...

pfpfpfp
2015/02/08
540
1
关于app后台由http改造为https的问题

想请教一下各位大神们关于https的问题,我这边在网上有了解到目前可以直接在网上买证书 或者自己生成证书,如果是采用的自己生成证书的方式(java的keytool工具生成的),现在我这边在浏览器...

鬼脚飞
2016/12/06
659
3

没有更多内容

加载失败,请刷新页面

加载更多

RabbitMq异常处理

1.查找指定文件位置 find . -name "*erlang.cookie" 2.Rabbitmq异常 ===========根据提示,应该是Erlang的cookie出现问题 attempted to contact: ['rabbit@DESKTOP-RVK1IHE'] rabbit@DESKTO......

zhaochaochao
24分钟前
2
0
Java虚拟机学习笔记

jconsole的连接 JConsole的远程连接 JConsole远程连接配置(用VisualVM进行远程连接的配置和JConsole是一摸一样滴) JVM之jconsole远程连接配置...

OSC_fly
24分钟前
1
0
区块链教程以太坊源码分析downloader-peer源码分析

  兄弟连区块链教程以太坊源码分析downloader-peer源码分析,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让...

兄弟连区块链入门教程
26分钟前
2
0
ubuntu 自定义记录用户登录以及操作日志

root@ms:~# cd /etc#更改之前先备份,养成良好的习惯,否则肠子都要悔青了root@ms:/etc# cp profile profile.bakroot@ms:/etc# vi profile 在文章末尾加入下列shell脚本 history US...

Marhal
26分钟前
1
0
liunx 下使用rpm进行软件卸载

rpm -qa | grep php 列出所有的php相关的rpm包 rpm -e xxx 删除包

bengozhong
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部