Byte Order Fallacy代码如何工作?

时间:2018-01-18 12:18:46

标签: endianness

在名为字节顺序错误this article中,作者声明担心代码运行的系统的字节顺序是不必要的。这篇文章也在a few places on StackOverflow中提到过。在文章中,作者假设只要您知道数据流的字节顺序,就可以使用以下代码段自动处理它:

Little-endian stream:

    var arr1 = [{
    food: 'pizza',
    car: 'ford'
  },
  {
    food: 'apple',
    car: 'volvo'
  }
];

var arr2 = [{
  animal: 'dog'
},
{animal:'cat'}
];

Big-endian流:

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

由于作者没有解释任何这一点,我有两个问题:一,这实际上是如何运作的?还有两个:如果没有检查系统的字节序,一个如何反转这一点(如果首先是可能的话)?

1 个答案:

答案 0 :(得分:1)

代码片段起作用了,因为无论字节序如何,位移位运算符都对数字进行操作,就好像它是big-endian一样。这意味着,在大端和小端机器上将0x1234向右移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