admin管理员组文章数量:1567290
作为一个非计算机专业的外来户在读取二进制的文件时碰到了大字端(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,符合人类的正常思维。 其中: 0x22被称为最高有效字节(most significant byte, MSB); 0x55被称为最低有效字节(last significant byte, LSB)。 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 0x223.为什么要有大字端和小字端的区别?
这其实与计算机的环境或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();
}
}
}
结果查看:
2022年3月17日 补充
发现一个检查大小字端的特别好的方法(C++):
/* -------------------------------------------------------------------- */
/* Establish the byte order on this machine. */
/* -------------------------------------------------------------------- */
#if !defined(bBigEndian)
int i = 1;
if( *((uchar *) &i) == 1 )
bBigEndian = FALSE;
else
bBigEndian = TRUE;
#endif
整型 int ,强制转换为无符号整型,如果小端正好低字节位被截取出一个字节,同样unchar也是1,如果是大端被截取的底字节位的unchar不是1。
参考:http://blog.csdn/andkylee/article/details/5361078点击打开链接
有兴趣的还可以查阅XDR和NDR编码类型
版权声明:本文标题:二进制读写中的大字端(Big Endian)和小字端(Little Endian) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1725722614a1038561.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论