目前使用的机器都是使用字节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. layoutSubviews在什么情况下会被调用

    layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSubviews. 2.addSubview会触发layoutSubviews. 3.设置view的Frame ...

  2. Exchange 2010 实用小技巧

    #Exchange安装必须开启防火墙服务 #批量建用户: for /f  "tokens=1,2,3,4,5,6,7 delims=," %a in (c:\users.csv) ...

  3. php注册数模式

    在前两篇单例模式和工厂模式后,终于迎来了最后一个基础的设计模式--注册树模式. 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里矫情一下它的名称,是因为我感觉注册树这个名称更 ...

  4. SIGPIPE信号

    #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include &l ...

  5. Office下载地址

    文件名cn_office_professional_plus_2016_x86_x64_dvd_6969182.isoSHA1277926A41B472EE38CA0B36ED8F2696356DCC ...

  6. git 客户端提交

    01 按照git到本地 02 按照小乌龟操作面板, 03 (git 和小乌龟)自动加载到右键快捷方式

  7. Python调用(运行)外部程序

    在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32pro ...

  8. 用TextKit实现图文混排(转载)

    Textkit是iOS7新推出的类库,其实是在之前推出的CoreText上的封装,有了这个TextKit,以后不用再拿着CoreText来做累活 了,根据苹果的说法,他们开发了两年多才完成,而且他们在 ...

  9. LINUX利用Speedtest测速

    那么远程服务器呢?要知道大多数远程服务器是没有浏览器可以打开web页面的.用浏览器打开网页测速的瓶颈就在此,你不能按计划的对服务器进行定期的常规测试.这时需要到一个名为Speedtest-cli的软件 ...

  10. OOP in JS Public/Private Variables and Methods

    Summary private variables are declared with the 'var' keyword inside the object, and can only be acc ...