大端模式和小端模式转化
在工作中遇到一个问题,数据是以大端模式存储的,而机器是小端模式,必须进行转换,否则使用时会出问题。
一、定义:
大端模式(Big Endian):数据的高字节,保存在内存的低地址中;数据的低字节,保存在内存的高地址中。
小端模式(Little Endian):数据的高字节,保存在内存的高地址中;数据的低字节,保存在内存的低地址中。
例如:
16位宽的数0x1234,在不同的模式下,存储方式为:
0x4000 | 0x4001 | |
小端模式 | 0x34 | 0x12 |
大端模式 | 0x12 | 0x34 |
32位宽的数0x12345678,在不同的模式下,存储方式为:
0x4000 | 0x4001 | 0x4002 | 0x4003 | |
小端模式 | 0x78 | 0x56 | 0x34 | 0x12 |
大端模式 | 0x12 | 0x34 | 0x56 | 0x78 |
二、判断大端模式和小端模式
使用联合,通过判断首个成员的值,确定是大端还是小端模式:
bool IsBigEndian(){ union NUM{int a; char b; }num; num.a = 0x1234; if( num.b == 0x12 ){ return true; } return false;
}
三、大端模式和小端模式转换
对32位的数,即4个字节,大端转换成小端:
方法1:使用移位运算。
uint32_t reversebytes_uint32t(uint32_t value){return (value & 0x000000FFU) << 24 | (value & 0x0000FF00U) << 8 | (value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24;
}
上述代码中,将低8位(0~8位)左移24位,变成了高8位(24~32位),8~16位左移8位变成了(16~24位)。将原高8位和高16位右移,变成了新的低8位和低16位。
这种方法效率采用了移位运算,效率很高。而且该方法亦可用于小端模式转成大端模式。
有了32位的转换方法,对64位,即8个字节的转换同理。不过直接写移位运算未免麻烦,可以直接使用上述函数:
// 先将64位的低32位转成小端模式,再将64位的高32位转成小端模式
// 在将原来的低32位放置到高32位,原来的高32位放置到低32位
uint64_t reversebytes_uint64t(uint64_t value){uint32_t high_uint64 = uint64_t(reversebytes_uint32t(uint32_t(value))); // 低32位转成小端uint64_t low_uint64 = (uint64_t)reversebytes_uint32t(uint32_t(value >> 32)); // 高32位转成小端return (high_uint64 << 32) + low_uint64;
}
方法2:对每个字节依次处理。
比如0x12345678,小端模式下可认为是12*(2^32) + 34*(2^16) + 56*(2^8) + 78*(2^0)。在大端模式下,排列顺序发生了变化。
uint32_t changeEndian_uint32t(uint32_t value){char* ptr = (char*)(&value);uint64_t base[4]; // 设置基base[0] = 1;for(int i = 1; i < 4; ++i){base[i] = base[i-1] * 256;}uint32_t res = 0;for(int i = 0; i < sizeof(value); ++ i){res += uint8_t(ptr[i]) * base[4-i-1];}return res;
}
上述代码中,第一句将输入的uint32_t的变量强制转换成字符类型数组,以便一个字节一个字节的处理。
参考:
http://baike.baidu.com/link?url=IQEyrhHqW0mnH27xCFiiUz5H395WaNG0cTkMB41xtjJ02nIzFINaCvS1IX4JURKkoCvjOlyve2Ze2HQyJqIvb_
http://blog.163.com/leng_zzu@126/blog/static/49955027201161210511469/
http://www.360doc.com/content/12/0727/08/10389317_226700605.shtml
大端模式和小端模式转化相关推荐
- java基础知识大端模式及其小端模式处理
那什么是大端模式和小端模式呢? 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往 ...
- C语言之大端模式与小端模式
大端模式与小端模式的定义(字节序) 大端模式:数据的高字节在低地址,低字节在高地址 小端模式:数据的高字节在高地址,低字节在低地址 怎么判断系统是大端模式和小端模式 首先来看两个知识点: (1)联合体 ...
- 大端模式和小端模式详解
怎么去理解大端和小端? 1.大端和小端核心是什么? 大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式,总结如下: 大端模式:低地址对应高字节 小端模式:低地址对应低字节 不管是大端还是 ...
- 【转】大端模式与小端模式、网络字节顺序与主机字节顺序 (经典)
大端模式与小端模式 一.概念及详解 在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式. 先回顾两个关键词,MSB和LSB: ...
- 计算机大端模式和小端模式 内存对齐问题(sizeof)
目录(?)[+] 一大端模式和小端模式的起源 二什么是大端和小端 三数组在大端小端情况下的存储 四为什么会有大小端模式之分呢 五如何判断机器的字节序 内存对齐问题 再讲讲pragma pack 内存对 ...
- 大端模式、小端模式、网络字节顺序与主机字节顺序
大端模式.小端模式.网络字节顺序与主机字节顺序 大端模式与小端模式 概念与详解 在各种体系的计算机中通常采用的字节存储机制主要有两种:big-endian和little-endian,即大端模式和小端 ...
- C/C++ 工具函数 —— 大端模式和小端模式的互换
小端模式:小在小,大在大:大端模式:小在大,大在小: uint32_t swap_endian(uint32_t val) {val = ((val << 8) & 0xFF00F ...
- matlab小端模式合并,大端方式和小端模式【YC】
大端模式和小端模式[YC] 小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址. 大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址. 下 ...
- 大端模式与小端模式的详解分析
大端序与小端序 何为大端序,小端序? 简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面 ...
最新文章
- Android 跨进程通信基础
- web developer tips (39):在Visual Studio 2008中取消远程web操作
- 全方面了解和学习PHP框架 PHP培训教程
- C#设置标记方法等为否决的不可用
- 2019蓝桥杯省赛b组
- ANSYS——“There is at least 1 small equation solver pivot term”问题的解决办法
- 乐高机器人教室布置图片大全_圣诞节手抄报内容简单图片漂亮
- mysql字段A复制到字段B,并替换指定字符
- ios textview间距_iOS开发之UITextView,设置textView的行间距及placeholder
- 此页的状态信息无效,可能已损坏---应用程序中的服务器错误---
- 我是如何入门机器学习的呢
- 苹果自带的清理软件_苹果电脑清理软件哪个好?对比CleanMyMac和腾讯柠檬清理软件...
- Mac 屏幕共享和远程控制
- 因代码不规范,国外程序员就枪击 4 个同事?你可能提前过了愚人节
- Day3:MVP+ButterKnife+Dagger2的使用
- 一份Python面试宝典
- vue+element 将密码输入框的小圆点显示为星号
- QGridLayout(表格布局)详细使用说明
- resolveSize()的使用
- 二维数组的认识及其表示元素的两种方式
热门文章
- 外挂辅助技术-统计背包HP药品数量代码编写
- 对于初学者来说怎么画人体比例?那Q版怎么画呢?
- 职教云python程序设计答案_智慧职教云课堂Python程序设计基础题目及答案
- javaWeb项目内存溢出解决方案
- 石头扫地机器人音量怎么调_石头扫地机器人T4使用指南及浅度测试
- 软文诞生并备受推崇的原因是什么
- DUF:Deep Video Super-Resolution Network Using Dynamic Upsampling Filters ...阅读笔记
- 华为平板鸿蒙,华为新平板用高通骁龙870,运行鸿蒙2.0
- 物联网工程实践日报表11
- 安全关闭 Linux 的方式