作为一个非计算机专业的外来户在读取二进制的文件时碰到了大字端(Big Endian)和小字端(Little Endian),由于没有计算机原理的基础知识,甚是头疼。查过资料之后才感觉略有清晰,其实非常简单:
首先,认识字节(Byte),计算机中Byte意思为“字节”,8个二进制位构成1个"字节(Byte)",即1Byte=8bit,字节是计算机处理数据的基本单位。所谓的大字端(Big Endian)和小字端(Little Endian)就是在存储数据时遵循不同的字节排列顺序,即字节序(Byte Order)不同。
1.含义
Big Endian:
按照从低地址到高地址的顺序存放数据的高位字节到低位字节,就是高位数字存储在前面,例如:整数(int)573785173用十六进制表示就是0x22334455,其中“0x”是十六进制的标识符。这个数字有四个字节构成,字节值分别为0x22、0x33、0x44和0x55。在二进制文件中如果是按照大字端(Big Endian)的形式存储,那么在文件中的顺序是这样:0x22、0x33、0x44、0x55,符合人类的正常思维。
Little Endian:按照从低地址到高地址的顺序存放数据的低位字节到高位字节,就是低位数字在前面。同样以上面的数字为例。0x22334455如果按照小字端(Little Endian)的形式存储,那么它的字节值存储顺序为0x55、0x44、0x33、0x22。
2. 二者的对比
整数573785173的16进制表示: 0x22334455
假设存储地址: 0x0155a800 0x0155a801 0x0155a802 0x0155a803
Big Endian法: 0x22 0x33 0x44 0x55
Little Endian: 0x55 0x44 0x33 0x22
3.为什么要有大字端和小字端的区别?
这其实与计算机的环境或CPU有关,对于大部分的CPU来说,字节都是按照Little形式存储的,但是在一些情况下可能是按照Big形式存储的,如在网络上传输数字时。
C#代码:存储二进制小字端
using System; using System.IO; using System.Runtime.InteropServices; namespace Little Endian { class Program { static void Main(string[] args) { FileStream fs = new FileStream("E:\\xiaoziduan.mh", FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); int sample = Convert.ToInt32(0x22334455); byte[] bytes = new byte[System.Runtime.InteropServices.Marshal.SizeOf(sample.GetType())]; GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); Marshal.StructureToPtr(sample, handle.AddrOfPinnedObject(), false); bw.Write(bytes); bw.Close(); fs.Close(); } } }
结果查看:
参考:http://blog.csdn.net/andkylee/article/details/5361078点击打开链接
有兴趣的还可以查阅XDR和NDR编码类型