C语言 - 大小端问题
目前使用的机器都是使用字节BYTE来存储的。
对于跨越多字节的对象,必须搞清楚两个规则:
- 这个对象的地址是什么
- 在存储器中如何按照这些字节的存放的书序
对于一个整型对象 a=0x12345678,一共有四个字节。
假设存放在地址0x00002000中,于是,在0x2000开始放0x78还是0x12就是一个大小端问题。
但是,对于只是读写一个WORD32而言,计算器如何存储WORD32字节序,其实并不重要。
大小端的存储示例:
大端法
0x2000 0x2001 0x2002 0x2003
小端法
0x2000 0x2001 0x2002 0x2003
什么时候会遭遇大小端问题:
- 在不同类型的机器之间通过网络传送二进制数据时
- 当阅读表示整型数据的字节序列时,这里重点是整型数据,并不是字节数据
- 档使用强制转换对象类型时候
对于二进制文件流:
文件流与网络流其实是一样的传输方式。
如果一个整型对象,使用fread的方式按照字节序读取进来,首先要知道二进制文件的字节流的结构意义。
- 1)从程序写入到二进制文件中
假设有整型对象a=0x12345678 b=0x1E2B3D4C
使用fwrite写入到二进制文件中
a、在小端机器上使用fwrite写入时,这两个整型对象在内存中的摆放方式为
0x200 0x201 0x202 0x203 0x204 0x205 0x206 0x207
78 56 34 12 4C 3D 2B 1E
0x200 0x201 0x202 0x203 0x204 0x205 0x206 0x207
4C 3D 2B 1E
写入到文件中
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
78 56 34 12 1E 2B 3D 4C
b、在小端机器上使用fwrite写入时,这两个整型对象在内存中的摆放方式为
0x200 0x201 0x202 0x203 0x204 0x205 0x206 0x207
12 34 56 78 1E 2B 3D 4C
写入到文件中
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
12 34 56 78 1E 2B 3D 4C
- 2)从二进制文件读取到程序中
譬如文件里有下面的二进制序列:
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
12 34 56 78 91 23 45 67
a、在小端机器上使用fread,读取到0x200地址上,
0x200 0x201 0x202 0x203 0x204 0x205 0x206 0x207
12 34 56 78 91 23 45 67
现在,代码中从0x200地址读出一个整型对象,由于该机器是小端,那么读出来就是0x78563412
b、在大端机器上使用fread,读取到0x200地址上,结果同上
0x200 0x201 0x202 0x203 0x204 0x205 0x206 0x207
12 34 56 78 91 23 45 67
但是,如果现在代码从0x200地址中读出一个整型对象时,读出来的整型对象将是0x12345678
对于文本文件:(并不区分大小端)
文本文件在文件中的存储方式是ASCII码的字节流
如果有char *s = "ABCD1234"
无论是大端还是小端机器,在内存里面的表示都是
0x200 0x201 0x202 0x203 0x204 0x205 0x206 0x207
41 42 43 44 31 32 33 34
所以使用stdio的库函数,写入到文件中,都是一样,从0地址开始按照byte写,连续写入8个字节
//对应int32大小的成员 的转换 范例
unsigned int swapInt32(unsigned int value)
{
return ((value & 0x000000FF) << 24) |
((value & 0x0000FF00) << 8) |
((value & 0x00FF0000) >> 8) |
((value & 0xFF000000) >> 24) ;
}
C语言 - 大小端问题的更多相关文章
- C语言大小端判定
要判定大小端?需要弄清以下几个问题: 1.当一个变量占多个字节时,变量的指针指向的是低地址 2.什么是大小端? 大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中. 小 ...
- C语言 大小端 字节对齐
参考:http://www.cnblogs.com/graphics/archive/2011/04/22/2010662.html 1. 大端序:数据的高位字节存放在地址的低端,低位字节存放在地址的 ...
- C语言判断大小端的几种方法
在操作系统中,经常会用到判断大小端,很多面试题中也会经常遇到,以前的时候没有总结过,这里总结一下. 以后用到了就直接可以用了. 所谓的大小端,大致的解释意思就是: [大端模式] CPU对操作数的存放方 ...
- C语言中的位域、字节序、比特序、大小端
转:http://www.360doc.com/content/13/0624/10/496343_295125641.shtml 1.比特序 / 位序 / bit numbering / bit ...
- C语言编写程序的大小端问题
有时候,用C语言写程序需要知道大端模式还是小端模式,,由于寄存器大于一个字节(8bit),就会存在一个字节安排的问题,例如(16bit)的short型,(32bit)的int型,具体需要看具体的编译器 ...
- C语言共用体、大小端、枚举
1.共用体和结构体的相同和不同 (1)相同点就是操作语法几乎相同.(2)不同点是本质上的不同.struct是多个独立元素(内存空间)打包在一起:union是一个元素(内存空间)的多种不同解析方式. # ...
- 计算机中的大小端模式及C语言中如何鉴别他们
我的博客:www.while0.com 参考http://blog.csdn.net/ce123_zhouwei/article/details/6971544 写的很详细. 大小端主要是对数字类型来 ...
- c语言:union,大小端
union: 不允许只用联合变量名作赋值或其它操作. 也不允许对联合变量作初始化赋值,赋值只能在程序中进行. 小端存储: 以字节为单位,低存低,高存高. 任何数据在内存中都是以二进制(1或着0)顺序存 ...
- C语言怎么简单测试为大小端模式
作者:Slience_J 原文地址:https://blog.csdn.net/slience_j/article/details/52048267 1.什么是大小端模式? 大端模式,是指数据的高字节 ...
随机推荐
- Python基础知识学习_Day7
一.Subprocess模块 1常用方法 执行命令,返回命令执行状态,0 or非0 >>> retcode = subprocess.call(["ls", &q ...
- ipv4属性无法打开
设置开机启动项: 点击左下角开始或windows+R-->msconfig 打开组策略:Windows+R-->输入gpedit.msc ipv4属性打不开 经过查看组策略什么未配置 ...
- android下拉刷新控件 android-pulltorefresh
运行效果: 介绍:ListView.ViewPager.WevView.ExpandableListView.GridView.(Horizontal)ScrollView.Fragment上下左右拉 ...
- c3p0私有属性checkoutTimeout设置成1000引发的调试错误:
checkoutTimeout设置成1000引发的调试错误: org.mybatis.spring.MyBatisSystemException: nested exception is org.ap ...
- centos php nginx 添加到service
1. nginx A. # vi /etc/init.d/nginx B. #!/bin/sh # Comments to support chkconfig on RedHat Linux # ch ...
- php笔记(五)PHP类和对象之对象的高级特性
对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断. class Car { } $a = ...
- ef code first 您没有所需权限
在进行数据库更新操作时,update-database -force,反复提示没有改表或者没有所需权限,昨晚折腾了4个小时没有搞定,太晚了,今天Google了一下,这方面的错误,提到的都很少,在一篇文 ...
- MFC窗口程序显示命令行输出窗口的方法
来源:http://blog.csdn.net/k_shmily/article/details/52596927 WINDOWS为你提供了一系列的API来完成这个功能,例如:ReadConsole, ...
- jQuery的animate在火狐浏览器上不支持backgroundPositionX的解决方法
在网上找的ffSupp.js文件 /** * 自定义backgroundPosition的animate,支持火狐,jQuery1.8以上版本 * @author Meleong * v1.00 */ ...
- python 如何读取大文件
一般的读取文件的方法: with open(file_path, "r") as f: print f.read() 或者 with open(file_path,"r& ...