如何在javascript中交换变量的endian-ness(字节顺序)

时间:2011-03-16 02:37:36

标签: javascript endianness

我正在接收并发送两个小端数字的十进制表示。我想:

  • 向左移动一个变量8位
  • 或者他们
  • 移位可变位数
  • 创建2个8位数字,代表16位数字的第一个和第二个半位。

javascript(根据https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators)在转移时使用大端表示...

字节顺序对我来说有点陌生(我只有90%确定我概述的步骤是我想要的。)所以交换有点令人眼花缭乱。请帮忙!我真的只需要知道如何以有效的方式交换订单。 (我只能想到在toString()返回值上使用for循环)

3 个答案:

答案 0 :(得分:29)

function swap16(val) {
    return ((val & 0xFF) << 8)
           | ((val >> 8) & 0xFF);
}

说明:

  1. 我们假设val0xAABB
  2. 屏蔽val&ing0xFF获取LSB:结果为0xBB
  3. Shift左边8位:结果为0xBB00
  4. Shift val右边8位:结果为0xAA(LSB右侧“掉线”)。
  5. 使用0xFF &ing获取LSB的结果为0xAA
  6. |ing它们的步骤3和步骤5的结果合并在一起:
    0xBB00 | 0xAA0xBBAA

  7. function swap32(val) {
        return ((val & 0xFF) << 24)
               | ((val & 0xFF00) << 8)
               | ((val >> 8) & 0xFF00)
               | ((val >> 24) & 0xFF);
    }
    

    说明:

    1. 我们假设val0xAABBCCDD
    2. 屏蔽val&ing0xFF获取LSB:结果为0xDD
    3. Shift向左生成24位:结果为0xDD000000
    4. 屏蔽val&ing 0xFF00获取第二个字节:结果为0xCC00
    5. Shift左边8位:结果为0xCC0000
    6. Shift val右边8位:结果为0xAABBCC(LSB右侧“掉线”)。
    7. 使用0xFF00 &ing获取第二个字节的结果:结果为0xBB00
    8. Shift val右边24位:结果为0xAA(除了MSB之外的所有内容都“从右侧”掉落)。
    9. 使用0xFF &ing获取LSB的结果为0xAA
    10. 将步骤3,5,7和9的结果与|ing组合在一起:
      0xDD000000 | 0xCC0000 | 0xBB00 | 0xAA0xDDCCBBAA

答案 1 :(得分:3)

此函数可用于更改js中的字节序:

const changeEndianness = (string) => {
        const result = [];
        let len = string.length - 2;
        while (len >= 0) {
          result.push(string.substr(len, 2));
          len -= 2;
        }
        return result.join('');
}

changeEndianness('AA00FF1234'); /// '3412FF00AA'

答案 2 :(得分:1)

使用&lt;&lt; (位移)运算符。例如:1&lt;&lt; 2 == 4.

我真的认为JavaScript的底层实现将使用它运行的平台正在使用的任何endianess。由于您无法直接访问JavaScript中的内存,因此您无需担心数字在内存中的物理表示方式。无论字节顺序如何,位移整数值总是产生相同的结果。使用指针查看内存中的各个字节时,只能看到差异。