文档章节

关于大、小端问题

01010101010101010101
 01010101010101010101
发布于 2014/01/03 21:19
字数 564
阅读 11
收藏 0
点赞 0
评论 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
跟你请教个关于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
[Android 网络开发] 求大神解答安卓网络图片略缩图问题

关于安卓网络图片加载,一般思路是什么?我现在的做法是直接服务器从数据库取得url然后返回到安卓端,安卓端直接用xutils的bitmap工具的display加载此url 但是这样的做法是没有经过压缩图片,...

王尼玛是浩明
2015/11/03
159
3
关于shiro实现webservice验证的问题

如题所述,项目架构为spinrgmvc+mybatis+shiro(实现web端权限的控制) 最近项目上遇到一个问题,需要整合axis2发布webservice服务。这就涉及到对webservice接口的权限验证。从kaitao大神的git...

老夫
2017/05/11
197
0
如何解决分布式系统中的跨时区问题[原理篇]

《谈谈你最熟悉的System.DateTime[上篇][下篇]》从跨时区的角度对DateTime这个我们熟知的类型进行了深入探讨,它们都是为这篇文章作的准备工作。在接下来的两篇文章中,我们将完整的介绍如果...

长平狐
2012/09/04
100
0
关于基于JFinal进行一键安装和增量更新的问题

@JFinal 你好,想跟你请教个问题: 关于基于JFinal进行一键安装和增量更新的问题 目前打算基于JFinal开发最新的B/S端产品系统,领导期望能够做到一键安装自动配置,然后以后可能针对系统进行...

糯米白饭团
2014/07/28
178
2
troubleshooting shuffle reduce端缓冲大小以避免OOM

shuffle reduce 端工作原理(省略,各种博客有讲解,而且都很详细!!!) reduce端默认buffer大小是48MB,spark的shuffle和MR的shuffle绝对是不一样的!!! 场景: map端的task是不断的输出...

SET
2016/10/30
65
0
关于ASIHttpRequest 传值。

哪位大神能帮我解决个问题 AISHttpRequest流传递。服务端是J2EE.后台报错。主要是因为: DataInputStream in = new DataInputStream(request.getInputStream()); String sb = in.readUTF(); ...

长大后的流岚
2013/05/07
678
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6用的外库遇到的问题

要用到wmi库 pip install wmi 装后不能用还要安装pywin32库。 要用到crypto加密模块安装pip instal pycrypto装后不能用。要安装pycryptodome。...

oisan_
14分钟前
0
0
select, poll, epoll I/O复用介绍

什么是I/O复用? 内核监视多个文件描述符(I/O文件句柄),一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。 I/O多路复用又被称为“事件驱动”(比如读写事...

xiaoxlm
15分钟前
0
0
【Spring 系列 给IOC容器添加组件的几种方式总结】

给Spring 注册Bean的几种方式总结。其中使用@Import注解是Spring Boot 完成自动配置的一个核心注解。 1、Spring 中给IOC容器添加组件的几种方式 在Spring的配置文件中,配置Bean(基于XML方式...

HansonReal
16分钟前
4
0
bootstrapTable语言包设置

###方法一引入不同的语言包 <script src="bootstrap-table-zh-CN.js"></script> ###方法二引入全语言包 <script src="bootstrap-table-locale-all.min.js"></script>//然后在初始化前设计默......

momo1987
17分钟前
0
0
Saltstack 常用命令

1、拷贝文件到客户端 # salt 'slaver.test.com' cp.get_file salt://apache.sls /tmp/cp.txt 2、拷贝目录到客户端 # salt 'slaver.test.com' cp.get_dir salt://test /tmp 3、显示存活的客户......

硅谷课堂
17分钟前
0
0
致初学者-如何学好Python这门编程语言?[图]

致初学者-如何学好Python这门编程语言?[图]: 对于很多Python3初学者,往往会面临以下问题:Python2和Python3我该学习哪一个?是否要安装Linux系统学习Python?Python3有各种版本我该安装哪...

原创小博客
20分钟前
1
0
E31---setopt=protected_multilib=false

今天在云服务器上装nginx,需要先安装一些依赖库比如zlib, ,但是安装zlib时候报错。 yum install -y zlib zlib-devel 1 (-y 指的是如果需要选yes no的自动y)下面是报错 Protected multil...

侠客行之石头
24分钟前
0
0
HTTP常见面试题

Http与Https的区别: HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头 HTTP 是不安全的,而 HTTPS 是安全的 HTTP 标准端口是80 ,而 HTTPS 的标准端口是443 在OSI 网络模型中,H...

JK_OPERA
26分钟前
0
0
python爬取站长素材网页图片保存到ppt中

网站地址:http://sc.chinaz.com/tupian/index.html 直接上代码: import requestsfrom bs4 import BeautifulSoupfrom pptx import Presentationfrom pptx.util import Inchesimpor......

你为什么不吃药
27分钟前
1
0
Ubuntu 18.04 swap空间的修改

一、准备工作 执行“sudo swapon -s”命令,查看是否已经存在swap file 二、修改swap file # 如果第一步存在swapfile则需要先禁用sudo swapoff /swapfile# 修改swap 空间的大小为2Gs...

Iceberg_XTY
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部