菜鸟学习历程【10】机器字节序、大小端的判断与修改
2017-11-18 20:10
260 查看
[align=center]机器字节序、大小端的判断与修改[/align]
首先,看一下下面这张图
![](https://img-blog.csdn.net/20171118202548788?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVlc3NhbmdfYm8=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[align=left] 我们定义一个整型变量a,假设其起始地址为0x100,结束地址为0x103,那么0x100对应低地址,0x103对应高地址,对于存放的二进制数据,最前面“0000 0000”为高字节,最后的“0000 0001”对应低字节,但究竟是高字节存放在低地址还是高地址,各个机器不同,因此会有不同的情况。[/align]
[align=left] 当高字节存放在低地址时,为大端,高字节存放在高地址为小端。[/align]
[align=left] 那么我们如何判断机器的字节序呢?[/align]
[align=left] 我们可以使用联合体,来解决这个问题,因为联合体中的成员共用一段内存。代码如下:[/align]
[align=left]那么我们如何实现大小端的转换呢?[/align]
[align=left]
[/align]
[align=left]我们使用位运算和移位实现这个问题。[/align]
[align=left]
[/align]
[align=left]首先,我们需要知道,是如何移位的,例如,unsigned int a;[/align]
[align=left]
[/align]
假设a 的二进制为:1011 1000 0001 1100 1110 0011 1011 0011
[align=left] [/align]
a & 0x0000 00ff << 24 1011 0011 0000 00000000 0000
0000 0000
[align=left]
[/align]
[align=left]a & 0x0000 ff00 << 8 0000 0000 1110 0011 0000 0000 0000 0000[/align]
[align=left]
[/align]
a & 0x00ff 0000 >> 8 0000 0000 0000 0000 0001 11000000
0000
[align=left]
[/align]
a & 0xff00 0000 >> 24
0000 0000 0000 0000 0000 0000 1011 1000
[align=left]
[/align]
[align=left]
[/align]
首先,看一下下面这张图
[align=left] 我们定义一个整型变量a,假设其起始地址为0x100,结束地址为0x103,那么0x100对应低地址,0x103对应高地址,对于存放的二进制数据,最前面“0000 0000”为高字节,最后的“0000 0001”对应低字节,但究竟是高字节存放在低地址还是高地址,各个机器不同,因此会有不同的情况。[/align]
[align=left] 当高字节存放在低地址时,为大端,高字节存放在高地址为小端。[/align]
[align=left] 那么我们如何判断机器的字节序呢?[/align]
[align=left] 我们可以使用联合体,来解决这个问题,因为联合体中的成员共用一段内存。代码如下:[/align]
#include <stdio.h> union test { short val; char array[sizeof(short)]; }; int main() { union test t; t.val = 0x0102; if(t.array[0] == 2 && t.array[1] == 1) { printf("Little Endian\n"); } else if(t.array[0] == 1 && t.array[1] == 2) { printf("Big Endian\n"); } else { printf("Unkown\n"); } return 0; }
[align=left]那么我们如何实现大小端的转换呢?[/align]
[align=left]
[/align]
[align=left]我们使用位运算和移位实现这个问题。[/align]
[align=left]
[/align]
[align=left]首先,我们需要知道,是如何移位的,例如,unsigned int a;[/align]
[align=left]
[/align]
假设a 的二进制为:1011 1000 0001 1100 1110 0011 1011 0011
[align=left] [/align]
a & 0x0000 00ff << 24 1011 0011 0000 00000000 0000
0000 0000
[align=left]
[/align]
[align=left]a & 0x0000 ff00 << 8 0000 0000 1110 0011 0000 0000 0000 0000[/align]
[align=left]
[/align]
a & 0x00ff 0000 >> 8 0000 0000 0000 0000 0001 11000000
0000
[align=left]
[/align]
a & 0xff00 0000 >> 24
0000 0000 0000 0000 0000 0000 1011 1000
[align=left]
[/align]
#include <stdio.h> int main() { unsigned int a = 1; unsigned int b; b = (((a & 0x000000ff) << 24) | ((a & 0x0000ff00) << 8 ) | ((a & 0x00ff0000) >> 8) | ((a & 0xff00000) >> 24)); printf("%d\n", b); return 0; }
[align=left]
[/align]
相关文章推荐
- 如何简单的判断机器的大小端字节序
- 用联合体判断机器是大端字节序还是小端字节序
- 什么是大端字节序?什么是小端字节序?如何用共用体判断机器的大小端?
- 判断大端字节序和小端字节序
- 大、小端机器判断
- 菜鸟学习历程【21】线程
- asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】
- 编写函数判断当前的机器大端小端
- asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】
- asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】 (转)
- 两种方法实现判断当前机器是大端还是小端
- 本地机器大小端判断(本机数据存储形式)
- 菜鸟学习历程【11】数据结构
- MySQL学习笔记10:修改数据
- 写一个函数:判断当前使用的机器是大端还是小端
- 判断机器是大端小端
- 菜鸟学习历程【32】函数模板与类模板
- (实训第二天)用C程序判断机器是大端模式还是小端模式,附源程序
- 判断机器的大小端 && 和位数
- JAVA从菜鸟【入门】到新手【实习】一一Python学习历程:Python解释器查阅内置函数