目前使用的机器都是使用字节BYTE来存储的。

对于跨越多字节的对象,必须搞清楚两个规则:

  • 这个对象的地址是什么
  • 在存储器中如何按照这些字节的存放的书序

对于一个整型对象 a=0x12345678,一共有四个字节。
假设存放在地址0x00002000中,于是,在0x2000开始放0x78还是0x12就是一个大小端问题。
但是,对于只是读写一个WORD32而言,计算器如何存储WORD32字节序,其实并不重要。

大小端的存储示例:
大端法

0x2000    0x2001    0x2002    0x2003
                        

小端法

0x2000    0x2001    0x2002    0x2003
                        

什么时候会遭遇大小端问题:

  1. 在不同类型的机器之间通过网络传送二进制数据时
  2. 当阅读表示整型数据的字节序列时,这里重点是整型数据,并不是字节数据
  3. 档使用强制转换对象类型时候

对于二进制文件流:
文件流与网络流其实是一样的传输方式。
如果一个整型对象,使用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语言 - 大小端问题的更多相关文章

  1. C语言大小端判定

    要判定大小端?需要弄清以下几个问题: 1.当一个变量占多个字节时,变量的指针指向的是低地址 2.什么是大小端? 大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中. 小 ...

  2. C语言 大小端 字节对齐

    参考:http://www.cnblogs.com/graphics/archive/2011/04/22/2010662.html 1. 大端序:数据的高位字节存放在地址的低端,低位字节存放在地址的 ...

  3. C语言判断大小端的几种方法

    在操作系统中,经常会用到判断大小端,很多面试题中也会经常遇到,以前的时候没有总结过,这里总结一下. 以后用到了就直接可以用了. 所谓的大小端,大致的解释意思就是: [大端模式] CPU对操作数的存放方 ...

  4. C语言中的位域、字节序、比特序、大小端

    转:http://www.360doc.com/content/13/0624/10/496343_295125641.shtml 1.比特序 / 位序 /  bit numbering / bit  ...

  5. C语言编写程序的大小端问题

    有时候,用C语言写程序需要知道大端模式还是小端模式,,由于寄存器大于一个字节(8bit),就会存在一个字节安排的问题,例如(16bit)的short型,(32bit)的int型,具体需要看具体的编译器 ...

  6. C语言共用体、大小端、枚举

    1.共用体和结构体的相同和不同 (1)相同点就是操作语法几乎相同.(2)不同点是本质上的不同.struct是多个独立元素(内存空间)打包在一起:union是一个元素(内存空间)的多种不同解析方式. # ...

  7. 计算机中的大小端模式及C语言中如何鉴别他们

    我的博客:www.while0.com 参考http://blog.csdn.net/ce123_zhouwei/article/details/6971544 写的很详细. 大小端主要是对数字类型来 ...

  8. c语言:union,大小端

    union: 不允许只用联合变量名作赋值或其它操作. 也不允许对联合变量作初始化赋值,赋值只能在程序中进行. 小端存储: 以字节为单位,低存低,高存高. 任何数据在内存中都是以二进制(1或着0)顺序存 ...

  9. C语言怎么简单测试为大小端模式

    作者:Slience_J 原文地址:https://blog.csdn.net/slience_j/article/details/52048267 1.什么是大小端模式? 大端模式,是指数据的高字节 ...

随机推荐

  1. ios之极光推送消息收到以后对消息的处理总结

    当我们的APP收到推送消息后,通常需要根据推送内容点击消息进入到指定的页面 这里讲一下收到推送消息后的处理,分为三种情况 :1.APP处于前台运行情况下     2.APP处于后台挂起情况下   3. ...

  2. linux下使用autoconf制作Makefile

    第一步:常用工具安装:正所谓:"工欲善其事,必先利其器".我们常用的工具主要有GNU AutomakeGNU AutoconfGNU m4GNU Libtool1.查看自己系统中是 ...

  3. 【ARM】S5PV210芯片的启动流程

    S5PV210芯片的设计者的思想 (1)芯片启动后执行iRom(BL0)的内容,进行时钟和看门狗等外设的初始化,将BL1和BL2拷贝到片内SRAM; (2)跳转到片内SRAM执行,完成外部SDRAM的 ...

  4. jquery验证表单是否满足正则表达式是否通过验证例子

    //验证通用函数 a表示元素对象,b表示正则表达式,c存bool值 function testyz(a,b,c){ c=false; $(a).on("blur",function ...

  5. C#Winform实现自动更新

    服务端: [WebMethod] public string GetNewService(string version) { //通过版本号进行比较 if (version == "v1.0 ...

  6. 改造vim

    1.安装Vim和Vim基本插件首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可: lingd@ubuntu:~/arm$sudo apt-get install vim vim-sc ...

  7. PortMon(电脑开放端口检查工具) 3.03 免费绿色版

    软件名称: PortMon(电脑开放端口检查工具) 3.03 免费绿色版 软件语言: 英文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / WinXP / Win2 ...

  8. linux ll命令参数的详解

    用法:ls [选项]... [文件]... 列出 FILE 的信息(默认为当前目录). 如果不指定-cftuvSUX 或--sort 选项,则根据字母大小排序. 长选项必须使用的参数对于短选项时也是必 ...

  9. Spring Boot--war发布

    启动main类继承SpringBootServletInitializer,并重写"protected SpringApplicationBuilder configure(SpringAp ...

  10. python 学习 [day7]面向对象

    编程模式概念 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向对象的三大 ...