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

新手上路,请多包涵

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

  • 将一个变量左移 8 位
  • 或者他们
  • 移动可变位数
  • 创建 2 个 8 位数字,分别代表 16 位数字的前半部分和后半部分。

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

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

原文由 griotspeak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 411
2 个回答
function swap16(val) {
    return ((val & 0xFF) << 8)
           | ((val >> 8) & 0xFF);
}

解释:

  1. 比方说 val0xAABB
  2. Mask val to get the LSB by & ing with 0xFF : result is 0xBB .
  3. 将结果向左 移动 8 位:结果为 0xBB00
  4. 向右 移动 val 8 位:结果为 0xAA (LSB 已经“掉落”到右侧)。
  5. 通过 & 使用 0xFF 屏蔽该结果以获得 LSB:结果为 0xAA
  6. 通过 | 将步骤 3 和步骤 5 的结果组合在一起:

0xBB00 | 0xAA0xBBAA


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

解释:

  1. 比方说 val0xAABBCCDD

  2. Mask val to get the LSB by & ing with 0xFF : result is 0xDD .

  3. 将结果向左 移动 24 位:结果为 0xDD000000

  4. 面具 val 获得第二个字节,由---- 0xFF00& 与—-一起使用 0xCC00

  5. 将结果向左 移动 8 位:结果为 0xCC0000

  6. 向右 移动 val 8 位:结果为 0xAABBCC (LSB 已经“掉落”到右侧)。

  7. 通过 & 使用 0xFF00 屏蔽该结果以获得第二个字节:结果为 0xBB00

  8. val 向右移动 24 位:结果为 0xAA (除了 MSB 之外的所有内容都“掉落”在右侧)。

  9. 通过 & 使用 0xFF 屏蔽该结果以获得 LSB:结果为 0xAA

  10. 通过 | 组合步骤 3、5、7 和 9 的结果:

    0xDD000000 | 0xCC0000 | 0xBB00 | 0xAA0xDDCCBBAA

原文由 LukeH 发布,翻译遵循 CC BY-SA 2.5 许可协议

这样的函数可以用来改变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'

原文由 Mihey Mik 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题