代码之家  ›  专栏  ›  技术社区  ›  user3003999

字节顺序错误代码是如何工作的?

  •  2
  • user3003999  · 技术社区  · 7 年前

    在里面 this article ,标题为 字节顺序谬误 ,作者声明,没有必要担心代码运行的系统的端性。这篇文章在 a few places on StackOverflow 也在本文中,作者假设,只要您知道数据流的结尾,就可以使用以下代码片段自动处理它:

    Little endian溪流:

    i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
    

    大端流:

    i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);
    

    由于作者没有对此进行任何解释,我有两个问题:, 这实际上是如何工作的 ? 第二点:一个如何 反转此方向,不检查端点 系统(如果可能的话)?

    1 回复  |  直到 7 年前
        1
  •  1
  •   user3003999 user3003999    7 年前

    代码段可以工作,因为位移位操作符对数字的操作就像它是大端的一样,而不管其端序如何。这意味着,位移位 0x1234 在big-endian和little-endian机器上右移4位将得到表示 0x0123 .

    这也适用于左侧,即。 0x1234 << 4 == 0x12340 ,在整数大小的限制范围内。

    相反,即写入具有给定端点的流,可以使用右移位而不是左移位来分解整数:

    char buf[4] = {x, x >> 8, x >> 16, x >> 24}; // Little-endian
    char fub[4] = {x >> 24, x >> 16, x >> 8, x}; // Big-endian