笔记-字节顺序标记

字节顺序标记(Byte Order Mark,简称 BOM)是一个用于指示字节序(Byte Order)的特殊字符,具体是 Unicode 字符 U+FEFF。字节序问题主要存在于那些使用多于一个字节表示每个字符的编码方案中,比如 UTF-16 和 UTF-32。字节序是指在这些字节中哪一个字节先存储,这在不同架构的系统中可能不同,通常分为大端序(Big-Endian)和小端序(Little-Endian):

  • 大端序(Big-Endian):高位字节(more significant byte)在前,低位字节(less significant byte)在后。例如,Unicode 字符 U+1234 在大端序中存储为 12 34
  • 小端序(Little-Endian):低位字节在前,高位字节在后。同样的 U+1234 字符在小端序中存储为 34 12

由于大端序和小端序的存在,使用如 UTF-16 和 UTF-32 等编码的文本文件可能需要一个 BOM 来明确字节序。例如,如果一个文本文件以 FE FF 开头,则表明该文件采用大端序的 UTF-16 编码;如果以 FF FE 开头,则表明采用小端序。

然而,UTF-8 不受字节序问题的影响,因为它使用单个字节序列来表示每个字符,不涉及字节间的顺序问题。UTF-8 编码中的每个字节是明确的,不会根据存储顺序而改变含义。因此,UTF-8 编码不需要 BOM 来指示字节序。

在实践中,虽然 UTF-8 本身不需要 BOM,但有时会在 UTF-8 编码的文件开始处看到一个 BOM(即 EF BB BF)。这是为了与那些需要 BOM 的编码方式兼容,或者用来明确指明文件是以 UTF-8 编码的。但在很多情况下,UTF-8 BOM 是不必要的,甚至可能导致问题,比如在不期望 BOM 的上下文中解析文本时。因此,是否使用 UTF-8 BOM 往往取决于具体的应用需求和上下文。


UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode字符集的可变长度字符编码系统。它可以用来表示Unicode标准中的任何字符,并且其设计旨在兼容传统的ASCII编码。

网络中会存在大端系统和小端系统?

大端(Big-Endian)系统和小端(Little-Endian)系统的存在主要是由于不同的硬件架构和设计哲学所导致的。当计算机科学还处于起步阶段时,不同的系统设计者对于如何在内存中存储数据有不同的看法。这些看法转化成了两种主要的数据表示方法,即大端序和小端序,它们定义了多字节数据在内存中字节的顺序。

大端序(Big-Endian)

在大端序中,最高有效字节(MSB)存储在最低的内存地址上,这也意味着数字的第一个字节是最重要的字节。如果我们读取一个地址,我们首先得到的是数字的最高有效位。这种方式直观地反映了我们通常书写数字的方式,例如数值0x12345678在内存中的存储顺序将是 12 34 56 78

大端序的优点:

  • 读取数据的高位非常直接,特别是对于网络协议而言,因为协议字段经常是从高位开始定义的。
  • 更符合人类阅读数字的习惯。

小端序(Little-Endian)

而在小端序中,最低有效字节(LSB)存储在最低的内存地址上。数值0x12345678在小端序的系统中将被存储为 78 56 34 12。这种方式在内存地址增长的方向上按照数字的权重递增。

小端序的优点:

  • 在进行数值计算时,低位在低地址,有时可以简化数值增长和扩展的处理。
  • 对于可以变长的数据表示,添加新的字节不会改变现有字节的地址。

为什么同时存在

不同的处理器架构在设计时会选择适合自己的一种模式。例如,Intel的x86架构就是小端序,而许多网络协议和早期的RISC架构如SPARC则是大端序。这些选择往往是基于硬件设计时的考虑和历史遗留问题。

随着时间的推移,两种系统都已经被广泛应用,而且各有其优势和特定的使用场景。在多数现代架构中,如x86-64和许多ARM架构,支持在两种模式之间切换,给操作系统和应用程序提供了更大的灵活性。然而,由于这两种不同的存储方式在互操作性上可能导致问题,因此在网络协议设计中通常会选择使用网络字节顺序(大端序),以确保不同系统之间数据传输的一致性。

最低有效字节是什么意思?

最低有效字节(Least Significant Byte,简称 LSB)指的是在多字节数字中数值最小的那个字节。在数字表示中,最低有效字节代表着数值中的最低位(通常是最右边的数字在十进制表示中,或是最低的二进制位)。换句话说,对于数字的修改,最低有效字节中的任何改变将对整个数值产生最小的影响。

例如,对于一个32位的整数0x12345678(在十六进制表示中),其字节从最低位到最高位依次为:

  • 0x78(十六进制的120,二进制的01111000)是最低有效字节。
  • 0x56(十六进制的86)是第二字节。
  • 0x34(十六进制的52)是第三字节。
  • 0x12(十六进制的18)是最高有效字节(Most Significant Byte,简称 MSB)。

在小端序存储中,0x78作为最低有效字节会被放置在最低的地址。这意味着如果我们在小端序系统中查看地址从低到高的数据,我们会首先看到78

在计算机内存和数据处理中,了解哪个字节是最低有效字节非常重要,特别是在执行二进制算术运算时。对于小端序系统,最低有效字节的处理通常是首先进行的,尤其在涉及数值增长或者运算进位时。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注