C#中的字节序

997 阅读2分钟

为建立中文知识库加块砖        ——中科大胡不归

问题描述

最近注意到C#字节序问题。在一个语言内闭环开发的情况下,往往不容易注意到字节序问题的存在。不涉及数字的传输转化,也不容易注意到字节序问题的存在。

然后项目设计C语言、Linux运行环境、Java等混在一起,字节序开始进入视野,于是我知道了大端字节序(Big Endian)和小端字节序(Little Endian)。

20160414225024808.png

大端字节序和我们正常的编程中对数字的16进制表示的顺序一致,高位在左,低位在右。我就是这么理解以快速分辨记忆的。

@祥知道总结的常见的系统和编程语言的字节序:

  • Windos(x86,x64)和Linux(x86,x64)都是Little Endian操作系统
  • 在ARM上,我见到的都是用Little Endian方式存储数据。
  • C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的。
  • JAVA编写的程序则唯一采用Big Endian方式来存储数据。
  • 所有网络协议也都是采用Big Endian的方式来传输数据的。所以有时我们也会把Big Endian方式称之为网络字节序

示例代码

#region Now we convert a float to byte[]

Console.WriteLine("Now we convert a float to byte[]:");
var z = -120.5f;
Console.WriteLine($"原数字 float:{z}");

Console.WriteLine("BitConverter.GetBytes() 默认得到小端字节序数组:");
var cc = BitConverter.GetBytes(z);
Console.WriteLine(BitConverter.ToString(cc));

Console.WriteLine("Array.Reverse() 反转成传输用大端:");
Array.Reverse(cc); //反转数组转成大端。
Console.WriteLine(BitConverter.ToString(cc));

Console.WriteLine("Array.Reverse() 还原为C#识别的小端字节序:");
Array.Reverse(cc); //还原为小端字节序
Console.WriteLine(BitConverter.ToString(cc));

Console.WriteLine("And we convert the byte[] to float:");
Console.WriteLine("还原数字:" + BitConverter.ToSingle(cc, 0));

#endregion

运行结果:

浮点数转换演示

参考文章

  1. [C#]大小端字节序(Big Endian和Little Endian)
  2. c# 通信中字节序处理
  3. # C# float与Byte[]互换