字节序的理解与分析

Posted 雪靡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节序的理解与分析相关的知识,希望对你有一定的参考价值。

字节序

什么是字节序?

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。

常见的字节序

  • 大端字节序(Big Endian):将多个字节值的最高有效字节储存于较低的内存位置。在大端处理器的机器上,数值0xABCD1234在内存存储为连续字节0xAB、0xCD、0x12、0x34。

  • 小端字节序(Little endian):将多个字节值的最低有效字节存储于较低的内存位置。比如在小段处理器的机器上,数值0xABCD1234在内存中存储为连续的字节0x34、0x12、0xCD、0x341

  • Windows(x86,x64)和Linux(x86,x64)都是Little Endian操作系统

  • 在ARM上,我见到的都是用Little Endian方式存储数据。

  • C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的。

  • JAVA编写的程序则唯一采用Big Endian方式来存储数据。

  • 所有网络协议也都是采用Big Endian的方式来传输数据的。所以有时我们也会把Big Endian方式称之为网络字节序2

  • C#使用Little Endian方式存储数据。

为什么会有小端字节序?

答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。
  但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。3

为什么在使用.NET的System.IO时无法选择首选符号?

这是因为该代码应尽可能在最重要的平台上运行。 C#/.NET来自Microsoft,主要在x86平台上运行。 x86是低位优先的,因此使库成为低位优先是有意义的。 Java是由Sun制造的,而Sun SPARC是big-endian的,因此Java标准是big-endian的。

Java被设计为与平台无关,这就是为什么它们采用更自然的顺序的原因。 .NET其次是其平台独立性,其主要目的是标准化Windows平台上的各种语言并带来更新的语言功能(如垃圾收集等)。MS/ intel世界通常以这种方式近视,因此大多数Windows程序员将读取的文件为小端。小端字节序是/是英特尔芯片上的首选排序。4

字节序转换

inline U16 swapU16(U16 value)
{
    return ((value & 0x00FF) << 8 ) | ((value & 0xFF00) >> 8);
}

inline U32 swapU32(U32 value)
{
    return ((value & 0x000000FF) << 24)
        | ((value & 0x0000FF00) << 8)
        | ((value & 0x00FF0000) >> 8)
        | ((value & 0xFF000000) >> 24);
}

// 浮点字节序转换,简便的方法就是使用union
union U32F32
{
    U32 m_asU32;
    F32 m_asF32;
};

inline F32 swapF32(F32 value)
{
    U32F32 u;
    u.m_asF32 = value;
    // 使用整数方式来转换字节序
    u.m_asU32 = swapU32(u.m_asU32);
    return u.m_asF32;
}

  1. 《游戏引擎架构》(第2版) 【美】Jason Gregory ↩︎

  2. [C#]大小端字节序(Big Endian和Little Endian)_祥的专栏-CSDN博客_c# 字节序 https://blog.csdn.net/humanking7/article/details/51155778 ↩︎

  3. 理解字节序 - 阮一峰的网络日志 https://www.ruanyifeng.com/blog/2016/11/byte-order.html ↩︎

  4. 关于c#:编程语言中的字节序 | 码农家园 https://www.codenong.com/2352570/ ↩︎

以上是关于字节序的理解与分析的主要内容,如果未能解决你的问题,请参考以下文章

TODO:字节序的一些理解

第五篇:主机字节序与网络字节序的转换

网络通信中字节序的理解

网络字节序与主机字节序的转换

网络字节序与主机字节序的转换

TODO:字节序的一些理解