打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[C#]大小端字节序(Big Endian和Little Endian)



说明

最近赶的一个项目是一个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;}


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
低字节序和高字节序相互转换(Little Endian/Big Endian) [C#]
C语言程序设计——数据在计算机中存储的顺序是怎样的
Big Endian and Little Endian(字节序)
大端(Big Endian)与小端(Little Endian)详解
 MSB和LSB
Big endian and Little endian computers
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服