目前使用的机器都是使用字节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. [ An Ac a Day ^_^ ] hdu 2830 矩阵交换II

    第一眼觉得是个dp 但是有了可以随意交换的条件觉得简单了不少 但是还是没做出来…… 看了一下别人的做法才觉得自愧不如 因为所有列都可以随意交换 应该尽量把长的放在一起 那么将所有的矩形排序之后 以第j ...

  2. Java learning notes (1):Basic Knowlege points

    Basic Knowlege points: 1: it's necessary that there is only one public class in per .java file 2: .j ...

  3. char、varchar、varchar(2)的区别

    char是存储字节是一定的,例如char(10),存储内容为"java",那么实际存储的是"java      ",后面是6个空字符.按字节存储: varcha ...

  4. find中的-print0和xargs中-0的区别

    默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的: [bash-4.1.5] ; ls -l total 0 -r ...

  5. python项目练习地址

    作者:Wayne Shi链接:http://www.zhihu.com/question/29372574/answer/88744491来源:知乎著作权归作者所有,转载请联系作者获得授权. 目前是3 ...

  6. Python学习笔记——进阶篇【第九周】———MYSQL操作

    Mysql 增删改查操作 查看数据库 show databases; 创建数据库并允许中文插入 create database s12day9 charset utf8; 使用数据库 use s12d ...

  7. WPF 限制Textbox输入的内容

    限制文本框TextBox的输入内容,在很多场景都有应用.举个例子,现在文本框中,只能输入0.1.2.3.4.5.6.7.8.9.“|”这11个字符. 限制输入0-9很容易实现,关键是这个“|”符号.它 ...

  8. Time Complexity Big-O

    It can be inserted anywhere. Note that if you insert it in the beginning the TC will be O(#s +c), bu ...

  9. curl 命令使用总结

    curl 查看网页源码 curl www.sina.com 保存页面 -o curl -o [文件名] www.sina.com 直接在curl命令后加上网址,就可以看到网页源码. 如果要把这个网页保 ...

  10. sql server 自定义split 标值函数

    自定义一个函数,分隔一个以分隔符的隔开字符串,例如把'1,3,5,7,9' 变成 数字1 3 5 7 9的结果集. 自定义标值函数: ),)) )) --实现split功能 的函数 as begin ...