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

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

作者头像
祥知道
发布于 2020-03-10 07:10:07
发布于 2020-03-10 07:10:07
2K00
代码可运行
举报
文章被收录于专栏:祥的专栏祥的专栏
运行总次数:0
代码可运行

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

原文链接: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
代码运行次数:0
运行
AI代码解释
复制
//翻转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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
分享一篇关于 C# 高低字节转换的问题
常用单片机内存一个地址只能存八位二进制数,最大数据只能是255(十进制). 当需要储存大于255的数据时,就需要用两个以上的内存地址,低位字节中的数是原数,高位字节中的数要乘以位数再与低位字节中的数相加才是你真要的数.
用户7053485
2021/01/29
2.8K0
网络字节序与主机字节序转换
在Linux网络编程中,经常碰到网络字节序与主机字节序的相互转换。说到网络字节序与主机字节序需要清晰了解以下几个概念。
恋喵大鲤鱼
2018/08/03
5.6K0
网络字节序与主机字节序转换
什么是大端序和小端序,为什么要有字节序
字节序,又称端序或尾序(英语中用单词:Endianness 表示),在计算机领域中,指电脑内存中或在数字通信链路中,占用多个字节的数据的字节排列顺序。
KevinYan
2021/03/16
12.8K0
C语言-- 大端小端详解
16bit宽的数0x1234在Little-endian模式(以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)为:
用户3479834
2021/02/03
4.9K0
[c语言日寄]内存初阶:大端字节序和小端字节序
今天给大家带来的是大端字节序(Big Endian)和小端字节序(Little Endian)题目,它们在硬件层面、网络通信、编程语言和数据存储都有涉及。
siy2333
2025/02/05
1560
使用MFC编写字节转码工具,支持数值与字节码的相互转换
最近基于MFC对话框,编写一个字节转码小工具(数值与字节码的相互转换,包括大小端和swap形式,数据包括整型、浮点型数据)。在使用串口、网络通信、嵌入式软件开发时,大小端字节序和Byte Swap是很常见的事情,许多工具软件诸如Modbus Poll和Modbus Slave都提供了数值(short,unsigned short,int, unsigned int,long long,unsigned long long,float,double等数值)的4种表示方式:Big-endian(大端)、Little-endian(小端)、Big-endian byte swap、Little-endian byte swap。如下图所示,Modbus Poll和Modbus Slave的Display菜单显示了这种情况:
ccf19881030
2020/03/19
2.3K0
[C&C++]大小端字节序转换程序
原文链接:https://blog.csdn.net/humanking7/article/details/81090308
祥知道
2020/03/10
2.2K0
大小端,你应该知道的,这篇文章讲全了
在计算机中,大小端描述了多字节数据在内存中的存储顺序。理解和正确处理大小端问题是编写健壮跨平台程序的关键。本文将全面介绍大小端的基本概念、判断方法、应用场景及注意事项,结合全样本数据分析哪些数据受大小端影响并给出处理方法。
程序员的园
2024/11/22
3450
大小端,你应该知道的,这篇文章讲全了
字节序: 一个不是很重要的概念
字节序 我们将一个4字节的汉字存入一段4字节的物理容器里, 该怎么存放? 直觉都是从左往右依次写入, 但也可以从右向左写, 甚至可以先写入奇字节再写偶字节, 这样比划下可以有n!种存储方式(n是字节数
Jean
2019/07/30
1.5K0
字节序: 一个不是很重要的概念
清晰讲解LSB、MSB和大小端模式及网络字节序
今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从MSB到LSB排列,检索查阅后将所得整理如下。
翎野君
2023/05/12
5.5K0
清晰讲解LSB、MSB和大小端模式及网络字节序
字节序(大小端)详解从高低地址和高低位开始理解【转】
http://blog.csdn.net/jk110333/article/details/44137423
保持热爱奔赴山海
2019/09/17
7.8K0
《编程千问》第七问:你了解大端和小端字节序吗?
大端(Big Endian) 和 小端(Little Endian) 是计算机中数据存储的两种字节序方式。它们主要描述多字节数据(如整型、浮点型)在内存中的存储顺序。
码事漫谈
2024/12/20
2650
面经及项目开发之网络编程核心概念:大端与小端
最近做的项目都涉及了协议,网络编程,针对协议与网络通信数据传输,大家使用抓包工具抓出来的数据例如:0x5634... 这些就是所谓的网络字节序,俗称大端!而针对不同的机器,有着不同的模式,有些是大端,有些是小端,如果在网络传输中发送的是原数据0x3456,而不是0x5634,那么会发生灾难性的错误,因此需要在发送前调用htons或者htonl函数将其转换为大端模式,也就是网络字节序,相信在深入理解一些开源的项目中,底层用C/C++ 写的程序中,大家会看到这些函数。
公众号guangcity
2019/09/20
1.3K0
[c语言日寄MAX]深度解析:大小端字节序
大小端字节序是什么?怎么通过程序判断机器是大端还是小段?全局变量和局部变量对大小端的判断有影响吗?本文将为你带来深度的大小端字节序解析,力求一文解决全部疑问。
siy2333
2025/03/27
720
[c语言日寄MAX]深度解析:大小端字节序
vppinfra--字节序转换、bitops、cacheline、jmp机制
vpp提供的字节序相关的api都定义在src\vppinfra\byte_order.h文件中,支持u16、i16、u32、i32、u64、i64字节序的转换。 下面是定义当前系统是大端还是小端的宏定义
dpdk-vpp源码解读
2023/03/07
8050
vppinfra--字节序转换、bitops、cacheline、jmp机制
音频字节序
字节顺序是指占用内存多于一个字节类型的数据在内存中的存放顺序,有小端、大端两种顺序。
ruochen
2021/12/15
9260
面试官:你能用Go写段代码判断当前系统的存储方式吗?
我一直都不理解,为什么要有大小端区分,尤其是小端,总是会忘记,因为他不符合人类的思维习惯,但存在即为合理,存在就有他存在的价值。这里有一个比较合理的解释:计算机中电路优先处理低位字节,效率比较高,因为计算机都是从低位开始的,所以计算机内部处理都是小端字节序。但是我们平常读写数值的方法,习惯用大端字节序,所以除了计算机的内部,其他场景大都是大端字节序,比如:网络传输和文件储存时都是用的大端字节序。
Golang梦工厂
2022/07/08
9180
面试官:你能用Go写段代码判断当前系统的存储方式吗?
谈一谈字节序的问题
字节序关系到我们的网络数据能否被正确地解析或使用。那么什么是字节序?又怎么处理字节序的问题呢?本文就来谈一谈字节序的问题。
编程珠玑
2019/09/03
8310
谈一谈字节序的问题
网络编程中的大小端
在计算机领域,大小端(Endianness)是指字节序的排列顺序。简单来说,就是存储器中多字节数据的字节序列,从高到低或从低到高的顺序不同。那么,何谓大小端呢?
李述铜
2023/05/01
8170
【网络编程系列】一:字节顺序的大端与小端表示法
一、字节序 字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序。 在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如:如果C/C++中的一个int型变量 a 的起始地址是&a = 0x100,那么 a 的四个字节将被存储在存储器的0x100, 0x101,0x102, 0x103位置。 根据整数 a 在连续的 4 byte 内存中的存储顺序,字节序被分为大端序(Big Endian) 与 小端序(Little Endian)两类。 然后就牵涉出两大CPU派系: Motorola 68
老白
2018/03/19
1.8K0
【网络编程系列】一:字节顺序的大端与小端表示法
推荐阅读
相关推荐
分享一篇关于 C# 高低字节转换的问题
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文