在名为字节顺序错误的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);
由于作者没有解释任何这一点,我有两个问题:一,这实际上是如何运作的?还有两个:如果没有检查系统的字节序,一个如何反转这一点(如果首先是可能的话)?
答案 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