我正在接收并发送两个小端数字的十进制表示。我想:
javascript(根据https://developer.mozilla.org/en/JavaScript/Reference/Operators/Bitwise_Operators)在转移时使用大端表示...
字节顺序对我来说有点陌生(我只有90%确定我概述的步骤是我想要的。)所以交换有点令人眼花缭乱。请帮忙!我真的只需要知道如何以有效的方式交换订单。 (我只能想到在toString()返回值上使用for循环)答案 0 :(得分:29)
function swap16(val) {
return ((val & 0xFF) << 8)
| ((val >> 8) & 0xFF);
}
说明:
val
是0xAABB
。val
以&
ing与0xFF
获取LSB:结果为0xBB
。0xBB00
。val
右边8位:结果为0xAA
(LSB右侧“掉线”)。0xFF
&
ing获取LSB的结果为0xAA
。|
ing它们的步骤3和步骤5的结果合并在一起:0xBB00 | 0xAA
是0xBBAA
。function swap32(val) {
return ((val & 0xFF) << 24)
| ((val & 0xFF00) << 8)
| ((val >> 8) & 0xFF00)
| ((val >> 24) & 0xFF);
}
说明:
val
是0xAABBCCDD
。val
以&
ing与0xFF
获取LSB:结果为0xDD
。0xDD000000
。val
以&
ing 0xFF00
获取第二个字节:结果为0xCC00
。0xCC0000
。val
右边8位:结果为0xAABBCC
(LSB右侧“掉线”)。0xFF00
&
ing获取第二个字节的结果:结果为0xBB00
。val
右边24位:结果为0xAA
(除了MSB之外的所有内容都“从右侧”掉落)。0xFF
&
ing获取LSB的结果为0xAA
。|
ing组合在一起:0xDD000000 | 0xCC0000 | 0xBB00 | 0xAA
是0xDDCCBBAA
。答案 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中的内存,因此您无需担心数字在内存中的物理表示方式。无论字节顺序如何,位移整数值总是产生相同的结果。使用指针查看内存中的各个字节时,只能看到差异。