前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[C#]大小端字节序(Big Endian和Little Endian)

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

作者头像
祥知道
发布2020-03-10 15:10:07
1.9K0
发布2020-03-10 15:10:07
举报
文章被收录于专栏:祥的专栏

原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:http://blog.csdn.net/humanking7/article/details/51155778


说明

最近赶的一个项目是一个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方式称之为网络字节序

代码示例

代码语言:javascript
复制
//翻转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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 代码示例
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档