[C#]大小端字节序(Big Endian和Little Endian)
2016-04-14 23:20
169 查看
原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接:/article/7763580.html
那么何为字节序(Endia)呢?
Big Endian是指低地址存放最高有效字节(MSB),而Little Endian则是低地址存放最低有效字节(LSB)。
有图有真相,举个例子,数字 0x12345678 在两种不同字节序CPU中的存储顺序如下图
为什么会有这样的情况呢?
这就要谈到两个不同的CPU派系。
Motorola的PowerPC系列CPU采用Big Endian方式存储数据。
Intel的x86系列CPU采用Little Endian方式存储数据。
再来说说,一些我所收集到的情况吧。
Windos(x86,x64)和Linux(x86,x64)都是Little Endian操作系统
在ARM上,我见到的都是用Little Endian方式存储数据。
C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的。
JAVA编写的程序则唯一采用Big Endian方式来存储数据。
所有网络协议也都是采用Big Endian的方式来传输数据的。所以有时我们也会把Big Endian方式称之为网络字节序。
原文链接:/article/7763580.html
说明
最近赶的一个项目是一个C#写的地面站,里面用到了一个变量isBigEndian,因为是改别人的代码,而且没有对应的文档说明,注释也是一个悲剧(而且是半开源的,核心代码都打成了DLL,人生感觉都要打出GG了),所以刚开始不知道是怎么回事,一百度BigEndian,才发现是,为了配置地面站和自驾仪通讯时的字节序,这下代码就豁然开朗了(真心觉得改没有注释和文档的代码是一个悲剧)。
那么何为字节序(Endia)呢?
Big Endian是指低地址存放最高有效字节(MSB),而Little Endian则是低地址存放最低有效字节(LSB)。
有图有真相,举个例子,数字 0x12345678 在两种不同字节序CPU中的存储顺序如下图
为什么会有这样的情况呢?
这就要谈到两个不同的CPU派系。
Motorola的PowerPC系列CPU采用Big Endian方式存储数据。
Intel的x86系列CPU采用Little Endian方式存储数据。
再来说说,一些我所收集到的情况吧。
Windos(x86,x64)和Linux(x86,x64)都是Little Endian操作系统
在ARM上,我见到的都是用Little Endian方式存储数据。
C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的。
JAVA编写的程序则唯一采用Big Endian方式来存储数据。
所有网络协议也都是采用Big Endian的方式来传输数据的。所以有时我们也会把Big Endian方式称之为网络字节序。
代码示例
//翻转byte数组 public static void ReverseBytes(byte[] bytes) { byte tmp; int len = bytes.Length; for (int i = 0; i < len / 2; i++ ) { tmp = bytes[len - 1 - i]; bytes[len - 1 - i] = bytes[i]; bytes[i] = tmp; } } //规定转换起始位置和长度 public static void ReverseBytes(byte[] bytes, int start, int len) { int end = start + len - 1; byte tmp; int i = 0; for (int index = start; index < start + len/2; index++,i++) { tmp = bytes[end - i]; bytes[end - i] = bytes[index]; bytes[index] = tmp; } } // 翻转字节顺序 (16-bit) public static UInt16 ReverseBytes(UInt16 value) { return (UInt16)((value & 0xFFU) << 8 | (value & 0xFF00U) >> 8); } // 翻转字节顺序 (32-bit) public static UInt32 ReverseBytes(UInt32 value) { return (value & 0x000000FFU) << 24 | (value & 0x0000FF00U) << 8 | (value & 0x00FF0000U) >> 8 | (value & 0xFF000000U) >> 24; } // 翻转字节顺序 (64-bit) public static UInt64 ReverseBytes(UInt64 value) { return (value & 0x00000000000000FFUL) << 56 | (value & 0x000000000000FF00UL) << 40 | (value & 0x0000000000FF0000UL) << 24 | (value & 0x00000000FF000000UL) << 8 | (value & 0x000000FF00000000UL) >> 8 | (value & 0x0000FF0000000000UL) >> 24 | (value & 0x00FF000000000000UL) >> 40 | (value & 0xFF00000000000000UL) >> 56; }
相关文章推荐
- C# 解决 调用线程非安全的控件xx不是在本线程上创建 异常
- c#使用wpd读取便携式设备信息二
- C#编程基础 实验(6) (1-3)
- C#—结构与枚举
- c#---读文件
- C#单例模式使用
- C#实现优先队列 基于二叉堆 附使用案例
- C# 使用Tuple传递多个参数
- C# Interlocked 笔记
- C# Timer类详解
- C# get
- C# 单例模式的不同写法对静态变量的影响
- c#XML配置文件辅助类
- C# Socket SSL通讯笔记
- C# DataTable添加行和列
- C# 数组与 list 互相转换案例
- c#概念理解
- 适用于WebForm Mvc的Pager分页组件C#实现
- C#委托与事件的本质区别
- C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别